Please open Telegram to view this post
VIEW IN TELEGRAM
😁30👾3👍2🤔1
Forwarded from Библиотека собеса по Java | вопросы с собеседований
— StackOverflowError
Возникает когда переполняется
— OutOfMemoryError
Возникает когда J
#jvm
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2👏1
🔍 Просто о сложном: Sealed Classes
В Java 17 появились Sealed Classes — механизм явного контроля иерархии наследования. Теперь можно точно указать, какие классы могут наследоваться от вашего типа.
По сути, это золотая середина между публичными классами (наследовать может кто угодно) и final классами (наследовать нельзя вообще). Вы сами решаете, кто входит в "белый список" наследников.
🔹 Зачем они нужны
Обычное наследование имеет проблемы:
— невозможно гарантировать закрытость иерархии (кто-то может добавить свой подтип);
— компилятор не может проверить, что все случаи покрыты (switch требует default, даже если вы обработали все варианты);
— сложно моделировать ADT (Algebraic Data Types) из функционального программирования.
Sealed классы решают эти проблемы: компилятор знает все возможные подтипы и может проверить полноту обработки в pattern matching.
🔹 Ключевые моменты
▪️ sealed — ключевое слово для объявления запечатанного класса/интерфейса.
▪️ permits — явное перечисление разрешённых наследников.
▪️ Наследники должны быть: final, sealed, или non-sealed.
▪️ Если наследники в том же файле, permits можно опустить.
▪️ Отлично работает с pattern matching и switch expressions.
🔹 Под капотом
Компилятор создаёт специальный атрибут PermittedSubclasses в bytecode, который содержит список разрешённых наследников. При загрузке класса JVM проверяет, что все указанные подклассы действительно существуют и корректны.
Pattern matching с sealed types позволяет компилятору проверить полноту покрытия без default ветки:
🔹 Подводные камни
— Обратная совместимость
Если вы сделали класс sealed в новой версии библиотеки, старый код с кастомными наследниками перестанет компилироваться.
— Видимость подклассов
Все наследники должны быть доступны sealed классу на момент компиляции. Нельзя добавить подкласс из другого модуля или jar.
— Сериализация
При десериализации sealed иерархии нужна осторожность? можно получить подделанный подтип. Используйте validation или sealed интерфейсы с records.
— non-sealed подклассы
Если сделать наследника non-sealed, он открывает дыру в иерархии и от него можно наследоваться кому угодно. Используйте осторожно.
✔️ Когда использовать
— Моделирование состояний (State machines, FSM).
— Result/Either типы для обработки ошибок без exceptions.
— Domain-driven design с явными типами (Payment может быть Card, Cash, Crypto).
— Pattern matching в бизнес-логике с гарантией полноты.
— API, где важно контролировать расширяемость.
❌ Не подходит:
— Публичные библиотеки с plugin-архитектурой.
— Когда нужна расширяемость от пользователей.
— Legacy код с активным использованием наследования.
— Простые entity/DTO классы без полиморфизма.
🐸 Библиотека джависта
#CoreJava
В Java 17 появились Sealed Classes — механизм явного контроля иерархии наследования. Теперь можно точно указать, какие классы могут наследоваться от вашего типа.
По сути, это золотая середина между публичными классами (наследовать может кто угодно) и final классами (наследовать нельзя вообще). Вы сами решаете, кто входит в "белый список" наследников.
🔹 Зачем они нужны
Обычное наследование имеет проблемы:
— невозможно гарантировать закрытость иерархии (кто-то может добавить свой подтип);
— компилятор не может проверить, что все случаи покрыты (switch требует default, даже если вы обработали все варианты);
— сложно моделировать ADT (Algebraic Data Types) из функционального программирования.
Sealed классы решают эти проблемы: компилятор знает все возможные подтипы и может проверить полноту обработки в pattern matching.
🔹 Ключевые моменты
▪️ sealed — ключевое слово для объявления запечатанного класса/интерфейса.
▪️ permits — явное перечисление разрешённых наследников.
▪️ Наследники должны быть: final, sealed, или non-sealed.
▪️ Если наследники в том же файле, permits можно опустить.
▪️ Отлично работает с pattern matching и switch expressions.
public sealed interface Result<T>
permits Success, Failure {
}
public final record Success<T>(T value)
implements Result<T> {}
public final record Failure<T>(String error)
implements Result<T> {}
🔹 Под капотом
Компилятор создаёт специальный атрибут PermittedSubclasses в bytecode, который содержит список разрешённых наследников. При загрузке класса JVM проверяет, что все указанные подклассы действительно существуют и корректны.
Pattern matching с sealed types позволяет компилятору проверить полноту покрытия без default ветки:
return switch(result) {
case Success(var value) -> process(value);
case Failure(var error) -> handleError(error);
};🔹 Подводные камни
— Обратная совместимость
Если вы сделали класс sealed в новой версии библиотеки, старый код с кастомными наследниками перестанет компилироваться.
— Видимость подклассов
Все наследники должны быть доступны sealed классу на момент компиляции. Нельзя добавить подкласс из другого модуля или jar.
— Сериализация
При десериализации sealed иерархии нужна осторожность? можно получить подделанный подтип. Используйте validation или sealed интерфейсы с records.
— non-sealed подклассы
Если сделать наследника non-sealed, он открывает дыру в иерархии и от него можно наследоваться кому угодно. Используйте осторожно.
— Моделирование состояний (State machines, FSM).
— Result/Either типы для обработки ошибок без exceptions.
— Domain-driven design с явными типами (Payment может быть Card, Cash, Crypto).
— Pattern matching в бизнес-логике с гарантией полноты.
— API, где важно контролировать расширяемость.
— Публичные библиотеки с plugin-архитектурой.
— Когда нужна расширяемость от пользователей.
— Legacy код с активным использованием наследования.
— Простые entity/DTO классы без полиморфизма.
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍4❤3👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁33👍4🔥3😢1🌚1
Забудьте про application.properties с хардкодом пароля. Подключение PostgreSQL к Spring Boot — это не только JDBC URL, но и пулы соединений, миграции схемы, мониторинг и graceful shutdown в production.
🧩 Вместо того чтобы копировать конфиг из StackOverflow, вы настраиваете полноценный слой персистентности: HikariCP для connection pooling, Flyway/Liquibase для версионирования схемы, Spring Data JPA для репозиториев, и health checks для Kubernetes.
📝 Промпт:
Generate a production-ready Spring Boot 3 + PostgreSQL integration with enterprise-grade configuration:
— Configure PostgreSQL datasource with HikariCP connection pool: pool size optimization, connection timeout, leak detection, and connection validation query.
— Set up Spring Data JPA with Hibernate: dialect configuration, DDL auto strategy, batch processing, second-level cache (EhCache/Redis).
— Implement database migration strategy using Flyway: versioned migrations, repeatable scripts, baseline configuration, and rollback procedures.
— Configure multiple datasources (primary + read replicas) with @Primary and @Qualifier annotations for load distribution.
— Add connection pool monitoring with Micrometer metrics: active connections, idle connections, pending threads, connection acquisition time.
— Implement database health checks for Spring Boot Actuator: connection validation, query timeout, custom health indicators.
— Configure transaction management: isolation levels, propagation strategies, read-only optimization, and timeout configuration.
— Set up connection pool resilience: retry logic with exponential backoff, circuit breaker pattern (Resilience4j), and fallback strategies.
— Add database credentials management: Spring Cloud Config integration, HashiCorp Vault support, or AWS Secrets Manager.
— Configure SSL/TLS connection with certificate validation for secure database communication.
— Implement audit logging: track query execution time, slow query detection, connection pool exhaustion alerts.
— Add database-specific optimizations: fetch size tuning, batch insert/update configuration, native query hints.
— Provide Docker Compose setup with PostgreSQL 16, pgAdmin, and application container with proper networking.
— Include integration tests with Testcontainers: schema validation, repository testing, transaction rollback verification.
— Add example entities with proper JPA annotations: @Entity, @Table, indexes, constraints, relationships (OneToMany, ManyToMany).
— Configure application profiles: dev (H2 in-memory), staging (PostgreSQL), prod (PostgreSQL with replication).
Deliverables:
— application.yml with environment-specific profiles
— build.gradle/pom.xml with all dependencies
— DbConfig.java with datasource and JPA configuration
— V1__init_schema.sql Flyway migration
— Sample entity, repository, and service layer
— Integration test with Testcontainers
— docker-compose.yml for local development
— README with connection troubleshooting guide
— добавьте pgvector для векторного поиска;
— настройте connection pool dashboard в Grafana: throughput, latency percentiles (p50/p95/p99), error rate;
— реализуйте database sharding для горизонтального масштабирования;
— интегрируйте pg_stat_statements для анализа медленных запросов в runtime.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍3❤1💯1
Топ-3 статьи о Java и смежных технологиях за неделю по версии нашего канала.
Разбор главной проблемы AI-помощников в коде — узкого контекста при RAG-подходе. Автор предлагает радикальное решение: скармливать Gemini 2.5 Pro весь проект целиком через code2prompt.
Интересный подход для стратегических задач вроде проектирования крупных фич, но важно помнить про NDA и безопасность. Метод только для pet-проектов и open source.
Глубокое сравнение трёх подходов к построению API с практическими кейсами. Разбор гибридной архитектуры: GraphQL для фронтенда (гибкость + over/under-fetching), gRPC для микросервисов (скорость + бинарный protobuf).
Production-опыт о том, как правильно проводить ревью: смотреть не только на diff, ограничиваться 5-6 комментариями вместо сотни, различать личные предпочтения и реальные проблемы.
Ключевой месседж: большинство PR должны получать Approve, а не Request Changes. В конце — практичный чеклист из 14 пунктов для систематизации процесса.
#News
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2❤1🥱1💯1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9🔥5👍4
🎁 И мозг прокачать, и макбук утащить!
Proglib.academy разыгрывает MacBook Pro 14 (M3 Pro, 36 GB, 1 TB SSD) 💻
Условия:
1️⃣ Покупаешь любой курс Proglib до 15 ноября.
2️⃣ Проходишь минимум 2 учебные недели (можно осилить за два вечера).
3️⃣ Пишешь куратору в чат своего курса: #розыгрыш.
Что за курсы?
— Математика для Data Science (6 месяцев боли и просветления).
— Основы Python, ML, алгоритмы, AI-агенты и даже курс для тех, кто в IT, но не кодит.
👉 Участвовать в розыгрыше
Proglib.academy разыгрывает MacBook Pro 14 (M3 Pro, 36 GB, 1 TB SSD) 💻
Условия:
1️⃣ Покупаешь любой курс Proglib до 15 ноября.
2️⃣ Проходишь минимум 2 учебные недели (можно осилить за два вечера).
3️⃣ Пишешь куратору в чат своего курса: #розыгрыш.
Что за курсы?
— Математика для Data Science (6 месяцев боли и просветления).
— Основы Python, ML, алгоритмы, AI-агенты и даже курс для тех, кто в IT, но не кодит.
👉 Участвовать в розыгрыше
❤1
Forwarded from Библиотека собеса по Java | вопросы с собеседований
Напишите метод для production-кода 👇
📦 Задание
Реализуйте метод для безопасного получения значения из вложенной Map с default-значением:
public class MapUtils {
public static <T> T getNestedValue(Map<String, Object> map,
String path,
T defaultValue) {
// Ваша реализация
}
}Требования
— Путь задается через точку: "user.address.city"
— Если любой уровень вложенности null или отсутствует → вернуть defaultValue
— Обработать пустой путь → вернуть defaultValue
— Обработать null в параметрах → вернуть defaultValue
Примеры использования
Map<String, Object> data = Map.of(
"user", Map.of(
"name", "John",
"age", 30,
"address", Map.of(
"city", "Moscow"
)
)
);
String city = getNestedValue(data, "user.address.city", "Unknown");
// → "Moscow"
Integer age = getNestedValue(data, "user.age", 0);
// → 30
String country = getNestedValue(data, "user.address.country", "Russia");
// → "Russia" (не найдено)
Ставьте → 🔥, если нравится формат. Если нет → 🤔
#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8🤔5❤1👍1
☕ Java && Coffee
Делитесь фотографиями выходных. Я сегодня в горах ⛰️
Отправляйте фото в комментарии👇🏻
🐸 Библиотека джависта
#DevLife
Делитесь фотографиями выходных. Я сегодня в горах ⛰️
Отправляйте фото в комментарии👇🏻
#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3😍3
💻 ВАЖНО: макбук ещё не забрали!
Proglib.academy продолжает розыгрыш MacBook Pro 14» (M3 Pro, 36 Гб, 1 Тб SSD).
Что нужно для участия?
— Берёшь любой курс Академии до 15 ноября.
— Проходишь хотя бы 2 недели обучения (можно за два дня ).
— Пишешь куратору #розыгрыш. Всё — ты в игре!
Что за курсы?
▫️Алгоритмы и структуры данных — если хочешь готовиться к собесам в Яндекс, FAANG и не сидеть на джуне вечно.
▫️Архитектуры и шаблоны проектирования — учат думать как senior, а не просто писать код.
▫️ Python, математика для DS, основы IT и другие темы — можно стартовать с нуля или усилить то, что уже знаешь.
👉 Влетай, не думай!
Proglib.academy продолжает розыгрыш MacBook Pro 14» (M3 Pro, 36 Гб, 1 Тб SSD).
Что нужно для участия?
— Берёшь любой курс Академии до 15 ноября.
— Проходишь хотя бы 2 недели обучения (
— Пишешь куратору #розыгрыш. Всё — ты в игре!
Что за курсы?
▫️Алгоритмы и структуры данных — если хочешь готовиться к собесам в Яндекс, FAANG и не сидеть на джуне вечно.
▫️Архитектуры и шаблоны проектирования — учат думать как senior, а не просто писать код.
▫️ Python, математика для DS, основы IT и другие темы — можно стартовать с нуля или усилить то, что уже знаешь.
👉 Влетай, не думай!
Нужно выделить метод целиком? Или весь блок try-catch? Или параметры метода? Обычно хватаешься за мышку и начинаешь аккуратно тащить курсор, рискуя промазать. А потом выделяешь заново, потому что захватил лишнюю скобку. Но можно лучше.
🔹 Что делает
— Умно расширяет выделение от курсора по синтаксическим границам кода
— Понимает структуру Java: слово → выражение → statement → блок → метод → класс
— Работает в обратную сторону: сужает выделение обратно по тем же границам
— Учитывает контекст: для строк расширяет от слова до всей строки, для вызовов — от аргумента до всего вызова
🔹 Зачем это нужно
— Выделяете нужный фрагмент за 2-3 нажатия вместо возни с мышкой
— Безошибочно выделяете сложные конструкции: цепочки вызовов, лямбды, generic-типы
— Идеально для последующего Extract Method, Copy-Paste, или Delete
— Особенно мощно для вложенных структур: легко выделить внутренний if в try внутри цикла
— Ускоряет рефакторинг: выделил логичный кусок → Extract → готово
🔹 Как использовать
— Поставьте курсор внутри нужного фрагмента (на переменную, в середину выражения, в метод)
— Нажмите Ctrl+W (Windows/Linux) или ⌥+Up (macOS) — выделение расширится на уровень выше
— Нажимайте повторно, чтобы расширять дальше: переменная → выражение → строка → if-блок → метод → класс
— Для сужения обратно: Ctrl+Shift+W (Windows/Linux) или ⌥+Down (macOS)
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4❤2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁8👍2🔥1