Forwarded from Библиотека задач по Java | тесты, код, задания
Что будет результатом запуска кода?
Anonymous Quiz
53%
Код скомпилируется и будет добавлено 42
26%
Ошибка компиляции
11%
ClassCastException
1%
Скомпилируется, но добавит null
8%
Посмотреть ответ
👍2🔥1👏1
🧩 final vs finally vs finalize()
Казалось бы, три похожих ключевых слова → final, finally, finalize(). А смысл принципиально разный. Давайте разберёмся.
🔹 final
Модификатор, который делает сущность неизменяемой:
▪️ final переменная → нельзя переприсвоить.
▪️ final метод → нельзя переопределить.
▪️ final класс → нельзя наследовать.
Используется для обеспечения immutability и контрактов в коде.
🔹 finally
Блок в try-catch, который выполняется всегда (даже если выброшено исключение).
Гарантирует освобождение ресурсов:
🔹 finalize()
Метод класса Object, вызываемый GC перед удалением объекта. Используется редко, считается устаревшим (deprecated с Java 9, удалён в Java 18).
Минус: непредсказуемое время вызова.
Современная альтернатива: try-with-resources или явная очистка.
💡 Вывод
final → контроль изменяемости.
finally → контроль завершения.
finalize() → контроль очистки (но не используйте).
🐸 Библиотека джависта
#CoreJava
Казалось бы, три похожих ключевых слова → final, finally, finalize(). А смысл принципиально разный. Давайте разберёмся.
🔹 final
Модификатор, который делает сущность неизменяемой:
▪️ final переменная → нельзя переприсвоить.
▪️ final метод → нельзя переопределить.
▪️ final класс → нельзя наследовать.
Используется для обеспечения immutability и контрактов в коде.
🔹 finally
Блок в try-catch, который выполняется всегда (даже если выброшено исключение).
Гарантирует освобождение ресурсов:
try {
FileReader reader = new FileReader("data.txt");
} catch (IOException e) {
e.printStackTrace();
} finally {
System.out.println("Закрываем ресурсы");
}
🔹 finalize()
Метод класса Object, вызываемый GC перед удалением объекта. Используется редко, считается устаревшим (deprecated с Java 9, удалён в Java 18).
Минус: непредсказуемое время вызова.
Современная альтернатива: try-with-resources или явная очистка.
final → контроль изменяемости.
finally → контроль завершения.
finalize() → контроль очистки (но не используйте).
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1👏1
🤖 Курс «ИИ-агенты для DS-специалистов»
Последняя возможность в этом году освоить ИИ-агентов с Proglib— старт живых вебинаров на курсе уже 3 октября!
Уже 24 студента изучают 5 лонгридов подготовительного модуля, чтобы сформировать базу к старту живых вебинаров с Никитой Зелинским.
📚 Бонус: при оплате до 30 сентября вы получите дополнительный лонгрид для подготовки к курсу. Это отличный способ подойти к занятиям уже с базой.
🔥 А ещё после прохождения курса у вас будет достаточно знаний, чтобы участвовать в хакатоне с призовым фондом 1 125 000 ₽.
🔗 Записаться на курс и узнать подробности
Последняя возможность в этом году освоить ИИ-агентов с Proglib— старт живых вебинаров на курсе уже 3 октября!
Уже 24 студента изучают 5 лонгридов подготовительного модуля, чтобы сформировать базу к старту живых вебинаров с Никитой Зелинским.
📚 Бонус: при оплате до 30 сентября вы получите дополнительный лонгрид для подготовки к курсу. Это отличный способ подойти к занятиям уже с базой.
🔥 А ещё после прохождения курса у вас будет достаточно знаний, чтобы участвовать в хакатоне с призовым фондом 1 125 000 ₽.
🔗 Записаться на курс и узнать подробности
Please open Telegram to view this post
VIEW IN TELEGRAM
😁27👍4💯1
Тут собраны самые популярные и эффективные инструменты для разных направлений: IDE, ИИ, безопасность и многое другое.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2❤1
— Убирает null-ы из кода
— Более читаемая и безопасная API
— Стандартный инструмент, без сторонних либ
— Часто приводит к избыточным обёрткам
— Усложняет код при массовом использовании
— Всё равно не решает проблему null на 100%
#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤1🔥1
Используете Optional?
Anonymous Poll
41%
Да, must have
6%
Нет, только мешает
54%
50/50: полезен в определённых кейсах
👍4🔥2😁1
Spring Boot — это не «новый фреймворк», а надстройка над Spring, которая убирает рутину и ускоряет разработку.
В обычном Spring нужно было вручную конфигурировать всё: от DataSource до DispatcherServlet. В Boot это делается автоматически через автоконфигурацию.
🔹 Как работает автоконфигурация
Spring Boot сканирует зависимости и classpath, а затем подключает нужные бины:
— Если у вас есть spring-boot-starter-data-jpa, Boot автоматически создаст EntityManagerFactory, DataSource, транзакционный менеджер.
— Если добавлен spring-boot-starter-web, он поднимет встроенный Tomcat/Jetty и зарегистрирует контроллеры. И так далее.
Магия кроется в аннотации @EnableAutoConfiguration (включается через @SpringBootApplication). Она загружает META-INF/spring.factories → список классов-конфигов → каждый проверяет условия @ConditionalOnClass, @ConditionalOnMissingBean и решает: активироваться или нет.
Потому что в Boot сотни готовых конфигураций «на все случаи жизни».
Фактически, это огромная библиотека «если увидишь X — настрой Y».
— Черный ящик
Легко забыть, что именно сконфигурировал Boot. Иногда приходится «копать» в автоконфигурацию, чтобы понять, какой бин реально используется.
— Избыточные зависимости
Подключив Starter, можно случайно притащить половину экосистемы Spring. Это увеличивает время старта и усложняет дебаг.
— Конфликт настроек
Собственная конфигурация может пересечься с автоконфигурацией.
⚡️ Хорошая практика
— Не доверяйте «чёрному ящику»: при старте приложения смотрите Spring Boot Actuator и логи автоконфигурации.
— Знайте про
--debug
при старте: он показывает, какие автоконфигурации включены или отключены.— В продакшене лучше контролировать, какие именно стартеры вы тянете. Иногда spring-boot-starter-web приносит в проект в три раза больше, чем реально нужно.
🎯 Итог
Spring Boot — это ускоритель, но не магия. Его сила в автоконфигурациях, а слабость в том, что легко потерять контроль.
Понимание того, как работает @EnableAutoConfiguration и условия @Conditional, отличает разработчика, который «просто пишет на Boot», от того, кто реально управляет приложением.
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🔥1😁1
🔥 Spring Security: как работает @PreAuthorize и зачем он нужен
В продакшн-коде часто возникает задача ограничить доступ к методам сервиса или контроллера. Делать это вручную — значит плодить дублирование и путать бизнес-логику с проверками. Для этого в Spring Security есть аннотация @PreAuthorize.
🔵 Как это работает
1. Аннотация вешается на метод (контроллер или сервис).
2. При вызове метода Spring Security перехватывает обращение и проверяет условие, указанное в аннотации.
3. Условие описывается на языке SpEL (Spring Expression Language), где доступно:
▪️ authentication — текущий объект аутентификации;
▪️ principal — данные текущего пользователя;
▪️ #id, #dto и т.д. — аргументы метода, к которым можно обратиться напрямую.
Пример:
→ метод вызовется только для пользователей с ролью ADMIN.
🔵 Что можно писать внутри
— Проверка ролей и прав
— Собственные условия
→ Здесь доступ только к своему профилю.
— Комбинации условий
Логика пишется прямо в SpEL:
— Сервисы внутри выражений
В выражение можно подключать свои бины:
→ бин reviewSecurity должен быть в контексте Spring и возвращать true/false.
🔵 Зачем это нужно
— Не надо вручную писать проверки в каждом методе.
— Авторизация централизована и читается прямо на уровне API.
— Условия можно вынести в отдельный сервис, чтобы не захламлять аннотацию.
👉 В итоге @PreAuthorize — это не только про роли, а про гибкий DSL проверки доступа, который можно расширять под проект: от банальной проверки ролей до бизнес-логики уровня "пользователь может редактировать только свои документы, если они ещё не опубликованы".
🐸 Библиотека джависта
#Enterprise
В продакшн-коде часто возникает задача ограничить доступ к методам сервиса или контроллера. Делать это вручную — значит плодить дублирование и путать бизнес-логику с проверками. Для этого в Spring Security есть аннотация @PreAuthorize.
1. Аннотация вешается на метод (контроллер или сервис).
2. При вызове метода Spring Security перехватывает обращение и проверяет условие, указанное в аннотации.
3. Условие описывается на языке SpEL (Spring Expression Language), где доступно:
▪️ authentication — текущий объект аутентификации;
▪️ principal — данные текущего пользователя;
▪️ #id, #dto и т.д. — аргументы метода, к которым можно обратиться напрямую.
Пример:
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long id) { ... }
→ метод вызовется только для пользователей с ролью ADMIN.
— Проверка ролей и прав
hasRole('USER'), hasAnyRole('ADMIN','MODERATOR')
hasAuthority('SCOPE_read') (актуально при работе с OAuth2)
— Собственные условия
@PreAuthorize("#id == authentication.principal.id")
public UserProfile getProfile(Long id) { ... }
→ Здесь доступ только к своему профилю.
— Комбинации условий
Логика пишется прямо в SpEL:
@PreAuthorize("hasRole('ADMIN') or @securityService.isOwner(#docId)")
public Document update(Long docId) { ... }
— Сервисы внутри выражений
В выражение можно подключать свои бины:
@PreAuthorize("@reviewSecurity.isOwner(#id, authentication)")
public Review update(Long id) { ... }
→ бин reviewSecurity должен быть в контексте Spring и возвращать true/false.
— Не надо вручную писать проверки в каждом методе.
— Авторизация централизована и читается прямо на уровне API.
— Условия можно вынести в отдельный сервис, чтобы не захламлять аннотацию.
👉 В итоге @PreAuthorize — это не только про роли, а про гибкий DSL проверки доступа, который можно расширять под проект: от банальной проверки ролей до бизнес-логики уровня "пользователь может редактировать только свои документы, если они ещё не опубликованы".
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍4🔥1
👾 AI-агенты — настоящее, о котором все говорят!
Уже 3 октября стартует второй поток нашего нового курса «AI-агенты для DS-специалистов».
Это продвинутая программа для тех, кто хочет получить прикладной опыт с LLM и решать сложные задачи.
На обучении вы соберёте полноценные LLM-системы с учётом особенностей доменных областей, получите hands-on навыки RAG, Crew-AI / Autogen / LangGraph и агентов.
🎓 В рамках курса вы научитесь:
1️⃣ адаптировать LLM под разные предметные области и данные
2️⃣ собирать свою RAG-систему: от ретривера и реранкера до генератора и оценки качества
3️⃣ строить AI-агентов с нуля — на основе сценариев, функций и взаимодействия с внешней средой
Научитесь применять похожие подходы в разных доменных областях, получите фундамент для уверенного прохождения NLP system design интервью и перехода на следующий грейд.
🗓️ Завтра первый вебинар, успевайте залететь в ряды ИИ-первопроходцев 👈🏻
Уже 3 октября стартует второй поток нашего нового курса «AI-агенты для DS-специалистов».
Это продвинутая программа для тех, кто хочет получить прикладной опыт с LLM и решать сложные задачи.
На обучении вы соберёте полноценные LLM-системы с учётом особенностей доменных областей, получите hands-on навыки RAG, Crew-AI / Autogen / LangGraph и агентов.
🎓 В рамках курса вы научитесь:
1️⃣ адаптировать LLM под разные предметные области и данные
2️⃣ собирать свою RAG-систему: от ретривера и реранкера до генератора и оценки качества
3️⃣ строить AI-агентов с нуля — на основе сценариев, функций и взаимодействия с внешней средой
Научитесь применять похожие подходы в разных доменных областях, получите фундамент для уверенного прохождения NLP system design интервью и перехода на следующий грейд.
🗓️ Завтра первый вебинар, успевайте залететь в ряды ИИ-первопроходцев 👈🏻
😁1
Forwarded from Библиотека задач по Java | тесты, код, задания
Что чаще всего будет результатом кода?
Anonymous Quiz
18%
1000
50%
число меньшее 1000
6%
0
10%
Ошибка компиляции
15%
Посмотреть ответ
👍4🔥1👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁42👍3💯3👾1
Производительность enterprise-систем часто упирается в кэширование. Но один только Redis — не всегда оптимально: сетевые вызовы вносят задержки, а локальные кэши не делятся данными между инстансами. Решение — связка in-memory и распределённого кэша.
📝 Промпт:
Generate a Spring Boot 3 configuration with multi-level caching (L1 + L2).
— Integrate Caffeine as in-memory (L1) cache for ultra-fast lookups.
— Integrate Redis as distributed (L2) cache for cross-instance consistency.
— Configure CacheManager that combines Caffeine (short-lived) and Redis (longer TTL) transparently.
— Implement annotation-based caching with @Cacheable, @CachePut, and @CacheEvict.
— Add fallback to DB if both caches miss, with metrics for hit/miss ratios.
— Ensure proper serialization (Jackson or Kryo) for complex entities in Redis.
— Provide cache invalidation strategies (per entity, per tenant, global).
— Добавьте Near-cache pattern для высоконагруженных сервисов.
— Интегрируйте с Spring Data Redis Streams для event-driven invalidation.
— Настройте Prometheus + Grafana dashboards для мониторинга кэш-слоя.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2❤1👏1
💰 Java и лицензии
Oracle активно напоминает компаниям о необходимости платить за использование Java.
— Кто-то считает это справедливым: язык, экосистема, поддержка стоят денег.
— Другие утверждают, что Oracle душит Java и правильный путь — полностью уходить в OpenJDK и его дистрибутивы (Adoptium, Azul, Amazon Corretto).
💬 Что думаете?
🐸 Библиотека джависта
#DevLife
Oracle активно напоминает компаниям о необходимости платить за использование Java.
— Кто-то считает это справедливым: язык, экосистема, поддержка стоят денег.
— Другие утверждают, что Oracle душит Java и правильный путь — полностью уходить в OpenJDK и его дистрибутивы (Adoptium, Azul, Amazon Corretto).
#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍4😁4🔥1
🔥 Задача на алгоритмы: оптимизация расписания задач
Иногда даже повседневные задачи превращаются в отличный повод вспомнить алгоритмы и потренировать мозг. Особенно если представить, что это часть сервиса планирования нагрузок или распределения вычислений в распределённой системе.
🔹 Условие
— У вас есть N задач, каждая с временем выполнения t[i].
— Есть K воркеров (потоков, серверов), которые могут выполнять задачи параллельно, но каждый воркер может брать только одну задачу за раз.
💡 Пример:
🔹 Уточнения
— N может достигать 10⁴
— K до 100
— Допустимо небольшое отклонение от оптимума (например, ≤5%)
— Требуется O(N log N) или лучше
— Можно предусмотреть балансировку “на лету” при поступлении новых задач
🔹 Вопрос
Какой алгоритм примените для минимизации времени выполнения?
Подумайте о вариантах:
— жадный
— динамическое программирование
— приближённые решения (если N велико)
🔹 Подсказки
—Это классическая NP-трудная задача разбиения множества (Partition Problem)
—На практике часто решается жадным алгоритмом LPT (Longest Processing Time first)
👇🏻 Скелет решения предложили в комментах.
💬 Делитесь своими решениями: какой алгоритм выбрали бы для продакшена, а какой — для интервью?
🐸 Библиотека джависта
#CoreJava
Иногда даже повседневные задачи превращаются в отличный повод вспомнить алгоритмы и потренировать мозг. Особенно если представить, что это часть сервиса планирования нагрузок или распределения вычислений в распределённой системе.
🔹 Условие
— У вас есть N задач, каждая с временем выполнения t[i].
— Есть K воркеров (потоков, серверов), которые могут выполнять задачи параллельно, но каждый воркер может брать только одну задачу за раз.
Нужно распределить задачи между воркерами так, чтобы время завершения всех задач было минимальным.
t = [3, 7, 2, 5, 4]
K = 2
— если раздать задачи просто по очереди, один воркер закончит через 14 секунд, другой — через 7.
— а если распределить умнее (например, [7,3] и [5,4,2]), итоговое время — 10 секунд.
🔹 Уточнения
— N может достигать 10⁴
— K до 100
— Допустимо небольшое отклонение от оптимума (например, ≤5%)
— Требуется O(N log N) или лучше
— Можно предусмотреть балансировку “на лету” при поступлении новых задач
🔹 Вопрос
Какой алгоритм примените для минимизации времени выполнения?
Подумайте о вариантах:
— жадный
— динамическое программирование
— приближённые решения (если N велико)
🔹 Подсказки
—
—
👇🏻 Скелет решения предложили в комментах.
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4👏2🔥1
Наш подписчик спрашивает:
Работаю джуном на проекте на Spring Boot и Hibernate. ORM вроде понятен — есть аннотации, Entity, Repository, всё работает «из коробки». Но недавно на собеседовании спросили, как работает JDBC под капотом, что такое PreparedStatement, и я понял, что знаю это очень поверхностно.
Возникает вопрос — стоит ли вообще углубляться в JDBC, если в проектах всё делается через ORM? Или это знания “для галочки”?
🔹 Что думаете?
Нужно ли джуну копать в сторону JDBC и понимать, как Hibernate общается с базой? Или достаточно знать ORM-уровень и двигаться дальше — в кэширование, оптимизацию запросов и т.п.?
— В каких кейсах применяете JDBC
— Насколько часто ORM «прячут» ошибки, которые проще понять через нативный SQL
— Что посоветуете джунам: когда стоит спуститься на уровень JDBC и зачем это вообще нужно
#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2🔥1
И вновь прошла насыщенная рабочая неделя. Сегодня немного сменилась локация, гуляю вдоль средиземного моря.
Как проходят ваши выходные?
Отправляйте фото в комментарии👇🏻
#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4😍2👍1