uz
Feedback

Firibgarlarga uchmang! Telemetrio bunday kanallarni topadi va belgilaydi 👉 Belgini ko‘rmoqchi bo‘lsangiz, obuna bo‘ling

Библиотека Java разработчика

Библиотека Java разработчика

Kanalga Telegram’da o‘tish

📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP

Ko'proq ko'rsatish

📈 Telegram kanali Библиотека Java разработчика analitikasi

Библиотека Java разработчика (@bookjava) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 10 006 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 12 158-o'rinni va Rossiya mintaqasida 63 521-o'rinni egallagan.

📊 Auditoriya ko‘rsatkichlari va dinamika

невідомо sanasidan buyon loyiha tez o‘sib, 10 006 obunachiga ega bo‘ldi.

26 Oktabr, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -56 ga, so‘nggi 24 soatda esa -1 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.

  • Tasdiqlash holati: Tasdiqlanmagan
  • Jalb etish (ER): Auditoriya o‘rtacha 8.06% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 4.04% ini tashkil etuvchi reaksiyalarni to‘playdi.
  • Post qamrovi: Har bir post o‘rtacha 806 marta ko‘riladi; birinchi sutkada odatda 404 ta ko‘rish yig‘iladi.
  • Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 4 ta reaksiya keladi.
  • Tematik yo‘nalishlar: Kontent string, интерфейс, строка, boot, api kabi asosiy mavzularga jamlangan.

📝 Tavsif va kontent siyosati

Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP”

Yuqori yangilanish chastotasi (oxirgi ma’lumot 27 Oktabr, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.

10 006
Obunachilar
-124 soatlar
-77 kun
-5630 kun
Postlar arxiv
🧠 Частая ловушка при работе с @Transactional в Spring Сейчас покажу вам один распространённый анти-паттерн, который легко пропустить — вызов транзакционного метода внутри того же класса. 📌 Пример:

@Service
public class UserService {

    @Transactional
    public void registerUser(UserDto dto) {
        saveUser(dto);
    }

    @Transactional
    public void saveUser(UserDto dto) {
        // сохранение пользователя
    }
}
💥 Проблема: Spring не применит транзакцию к saveUser(), потому что вызов происходит внутри одного и того же бина — минуя прокси. Spring AOP работает через прокси, и @Transactional "срабатывает", только если метод вызывается извне, через прокси-объект. ⚠️ Это может привести к очень странным багам: вы думаете, что транзакция есть, а её нет. 💡 Как исправить: 1. Вынести метод в отдельный бин:

@Service
public class UserSaver {
    @Transactional
    public void save(UserDto dto) {
        // сохраняем
    }
}

@Service
public class UserService {
    private final UserSaver saver;

    public UserService(UserSaver saver) {
        this.saver = saver;
    }

    public void registerUser(UserDto dto) {
        saver.save(dto);
    }
}
2. Или использовать TransactionTemplate вручную. ✅ Всегда проверяйте, как вызываются методы с @Transactional. Особенно при рефакторинге! 📲 Мы в MAX 👉@BookJava

👩‍💻 Стоит ли учить Java в 2026: куда движется язык и где работают джависты Приглашаем на открытый урок. 🗓 16 июля в 20:00
👩‍💻 Стоит ли учить Java в 2026: куда движется язык и где работают джависты Приглашаем на открытый урок. 🗓 16 июля в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Java-разработчик». Программа урока: ✔️ Развенчиваем главный миф новичка: правда ли, что «Java умерла» и всем надо идти в Python или Go ✔️ Где Java реально работает в 2026: банки, финтех, маркетплейсы, стриминги с миллионами пользователей, логистика ✔️ Big Data на JVM: почему Kafka, Spark и Hadoop написаны на Java и зачем это знать даже питонисту ✔️ Куда движется язык: релизы каждые полгода, борьба с многословностью, нативная компиляция (GraalVM), связка с AI ✔️ Карьера джависта: зарплаты, стабильность и почему этот язык — фундамент для долгого пути в IT 🔗 Ссылка на регистрацию: https://vk.cc/cZloUh Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

🧠 @Value vs @ConfigurationProperties — кого выбрать? Часто вижу, как даже опытные разработчики по привычке используют @Value для инъекции конфигурации:

@Value("${app.timeout}")
private Duration timeout;
⚠️ Но с ростом приложения @Value становится хрупким и неудобным. 📌 Лучший подход — использовать @ConfigurationProperties:

@ConfigurationProperties(prefix = "app")
public record AppProperties(Duration timeout, String apiKey) {}

@Bean
@ConfigurationPropertiesBinding
public AppProperties appProperties() {
    return new AppProperties();
}
✅ Преимущества @ConfigurationProperties: - 💡 Группирует настройки логически - 🔍 Работает с валидацией (@Validated, @NotNull, и т.д.) - 📚 Отлично поддерживается IDE (автокомплит, рефакторинг) - 🔧 Удобно тестировать и мокать 🆕 Начиная с Spring Boot 2.2+, можно использовать record-классы и просто зарегистрировать бин через @EnableConfigurationProperties:

@Configuration
@EnableConfigurationProperties(AppProperties.class)
public class AppConfig {}
Так что, если у вас в проекте до сих пор десятки @Value — самое время навести порядок. 📲 Мы в MAX 👉@BookJava

🧠 @Value в Spring — это ловушка, если вы используете списки или map'ы Многие знают, что можно заинжектить список строк из application.yml вот так:

app:
  langs:
    - en
    - fr
    - de

@Value("${app.langs}")
private List<String> langs;
Но знаете, что вы получите? ⚠️ ОШИБКУ. @Value не умеет парсить YAML-массивы. Он ожидает строку, и даже с CSV-строкой (en,fr,de) — всё не так очевидно: Spring не применяет ConversionService для списков. 📌 Решение — использовать @ConfigurationProperties:

app:
  langs:
    - en
    - fr
    - de

@ConfigurationProperties(prefix = "app")
@Component
public class AppProps {
    private List<String> langs;
    // геттеры/сеттеры
}
💡 Профит: - работает с List, Map, вложенными объектами; - валидация через @Validated и @NotEmpty; - легко покрыть тестами; - меньше магии. ⚠️ @Value хорош для простых скаляров. Всё остальное — через @ConfigurationProperties. 📲 Мы в MAX 👉@BookJava

🔍 Почему Optional — это не замена null везде и всегда Привет! Сегодня хочу поделиться одной из часто встречающихся ошибок при использовании Optional в Java. Многие разработчики, особенно начинающие, начинают использовать Optional везде, где может быть null, думая, что это автоматически делает код "безопасным". Но так ли это? 📌 Ключевая идея Optional — сигнализировать о возможном отсутствии значения в результате вызова метода. А не заменять все поля и параметры на Optional. Примеры плохой практики:

public class User {
    private Optional<String> name; // ❌ Не нужно так делать
}
Почему это плохо: - Увеличивается сложность сериализации (особенно с Jackson, GSON). - Не соответствует архитектурной задумке: Optional — это не контейнер для полей. - Проблемы с JPA (Hibernate не дружит с Optional-полями). - Понижается читаемость кода. 💡 Лучше использовать Optional вот так:

public Optional<User> findUserById(Long id) {
    // Возвращаем Optional, потому что пользователь может не существовать
}
То есть Optional — это про контракт на метод, а не про хранение данных. Если кратко: - ✅ Используй Optional в сигнатурах методов, когда результат может отсутствовать. - ❌ Не используй Optional в полях и параметрах конструктора. А ты как используешь Optional в проектах? Был ли опыт с его неправильным применением? Пиши в комментах👇 📲 Мы в MAX 👉@BookJava

👩‍💻 Как работает @Transactional в Spring: границы транзакций и типовые ошибки Приглашаем на открытый урок. 🗓 29 июня в 20:
👩‍💻 Как работает @Transactional в Spring: границы транзакций и типовые ошибки Приглашаем на открытый урок. 🗓 29 июня в 20:00 МСК 🆓 Бесплатно. Урок в рамках старта курса «Разработчик на Spring Framework». На занятии мы разберем: ✔️Что реально делает @Transactional в Spring ✔️Почему важны proxy и вызов метода через Spring Bean ✔️Как работают propagation-режимы на примере REQUIRED и REQUIRES_NEW ✔️Когда происходит rollback и почему checked exceptions не всегда откатывают транзакцию ✔️Типовые ошибки при работе с транзакциями в сервисном слое Урок будет полезен Java/Kotlin-разработчикам, которые уже пишут приложения на Spring или начинают использовать Spring в реальных backend-проектах и хотят лучше понимать поведение транзакций. 🔗 Ссылка на регистрацию: https://vk.cc/cZ9GGY Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

🧠 Как Java хранит boolean в памяти? Сегодня я покажу вам, почему boolean в Java — это не просто true или false. А за этим простым типом скрывается интересный нюанс, особенно если ты задумываешься об экономии памяти. В Java нет отдельного типа, который занимает всего 1 бит. Хотя логично было бы ожидать, что boolean — это один бит (true/false), на самом деле в памяти он занимает 1 байт (а иногда и больше, в зависимости от структуры объекта). Пример:

public class Flags {
    boolean flag1;
    boolean flag2;
    boolean flag3;
}
Ты думаешь — три бита. Но JVM выравнивает поля, и из-за этого объект может занимать 16 байт или больше, в зависимости от архитектуры. Почему так? 📌 Причина: JVM упрощает модель памяти ради производительности — доступ к байтам быстрее, чем к битам. Нет битовых сдвигов, масок и лишней логики. 💡 Что делать, если хочется сэкономить память? Используй BitSet:

BitSet flags = new BitSet(3);
flags.set(0, true);
Это уже реальная битовая структура. Отличный выбор, если у тебя десятки или сотни логических флагов. А ты знал об этом нюансе хранения boolean? Пиши в комментариях, сталкивался ли с перерасходом памяти из-за простых типов. 📲 Мы в MAX 👉@BookJava

🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП

🎯 Как Java находит классы? Под капотом ClassLoader'ов Сечас покажу вам одну из самых недооценённых тем в мире Java — механизм загрузки классов. Когда ты запускаешь Java-приложение, оно не просто «видит» все классы. За кулисами работает цепочка загрузчиков: 1. Bootstrap ClassLoader Самый базовый. Загружает классы из JDK (rt.jar, java.base, и так далее). На него даже нельзя получить ссылку в коде. 2. Platform ClassLoader (ранее Extension) Загружает модули платформы (jmods), доступные из JDK, но не из java.base. 3. Application ClassLoader Твой лучший друг. Он отвечает за загрузку классов из classpath (например, target/classes и lib/*.jar). Но вот где начинается магия — ты можешь создать собственный ClassLoader и загружать классы в рантайме из файлов, БД или даже сети. Например:

ClassLoader customLoader = new URLClassLoader(new URL[]{new File("plugins/").toURI().toURL()});
Class<?> pluginClass = customLoader.loadClass("com.example.PluginImpl");
💡 Это используется в плагинных системах (например, IntelliJ, Jenkins, Minecraft). Но будь осторожен — неправильная работа с загрузчиками может привести к ClassCastException, даже если классы выглядят одинаково. 📲 Мы в MAX 👉@BookJava

Понимание разницы между Error и Exception в Java ✅ Что такое Error в Java? - Error (ошибка) в Java представляет собой серьёзн
Понимание разницы между Error и Exception в Java ✅ Что такое Error в Java? - Error (ошибка) в Java представляет собой серьёзные проблемы, которые программа не должна пытаться обрабатывать. Такие ошибки, как правило, генерируются виртуальной машиной Java (JVM) и указывают на сбои, не зависящие от кода программы — например, утечки памяти или переполнение стека. Что такое Exception в Java? - Exception (исключение) — это ситуации, которые программа может предсказать и обработать. Это ошибки, от которых можно восстановиться во время выполнения с помощью механизмов обработки исключений, таких как конструкции try-catch. 📲 Мы в MAX 👉@BookJava

🔥24 июня в 20.00 мск. приглашаем на открытый урок: "Отказоустойчивый и высоко-доступный кластер RabbitMQ" На вебинаре разбер
🔥24 июня в 20.00 мск. приглашаем на открытый урок: "Отказоустойчивый и высоко-доступный кластер RabbitMQ" На вебинаре разберём практические подходы к созданию отказоустойчивой и высоко-доступной очереди сообщений для высоконагруженных систем. 📌 Что будет: — Запуск и настройка кластера: Quorum Queues и Mirrored Queues (синхронная репликация) — Синхронизация очередей и обеспечение согласованности — Dead Letter Queue + правильные настройки durability — Гарантии доставки для Producer: баланс между надёжностью и производительностью — Asynchronous cluster-to-cluster message routing: Exchange Federation и Shovels 🎯 После вебинара вы сможете: — Самостоятельно развернуть отказоустойчивый кластер RabbitMQ — Настраивать Quorum Queues и Mirrored Queues под разные сценарии — Правильно работать с Dead Letter Queues и гарантиями доставки — Организовывать межкластерное взаимодействие сообщений — Проектировать надёжные асинхронные коммуникации в микросервисной архитектуре 👉 Регистрация открыта: https://vk.cc/cYZuQo Вебинар приурочен к старту курса «Высоконагруженные системы: архитектура и масштабирование». 🎁При покупке курса вы получите в подарок мини-курс по Kafka, который поможет подготовиться к собеседованию в бигтех Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

🧩 Nullable поля в Entity: угроза вашему приложению Привет, друзья! Сегодня хочу поделиться одной ошибкой, которую часто встречаю в проектах — использование nullable = true в JPA-сущностях по умолчанию, без осознанного выбора. Когда мы пишем:

@Column(name = "middle_name")
private String middleName;
JPA считает, что поле nullable, даже если по бизнес-логике оно быть пустым не должно. А вот что будет, если вы забыли это уточнить: 1. На уровне БД поле будет NULLABLE. 2. Hibernate не подскажет, что вы забыли заполнить поле. 3. В будущем это приведёт к NPE, особенно при маппинге DTO → Entity. 4. При миграциях Flyway/ Liquibase — возможно несоответствие схемы и модели. 🔍 Что делать? 1. Явно указывать nullable = false, если поле обязано быть заполнено:

@Column(name = "email", nullable = false)
private String email;
2. Использовать Bean Validation (@NotNull) — и не забывать включить её в контроллерах, сервисах, Hibernate. 3. Проверяйте соответствие схемы и сущностей. Можно использовать плагин Hibernate5DDL или включать валидацию схемы при старте. 📌 Простой совет: по умолчанию всё @Column(nullable = false), пока не докажете обратное. Берегите свои сущности 😉 📲 Мы в MAX 👉@BookJava

🧹 Как не захламлять логи в Java Сегодня покажу вам простой, но важный приём: логируйте по уровню, а не по привычке. Многие делают так:

log.info("User found: " + user);
Кажется безобидным? А теперь представьте, что в user лежит целый граф сущностей с ленивыми загрузками, или список из тысячи записей. Вы просто убьёте читаемость логов и производительность. Вот что делать вместо:

if (log.isDebugEnabled()) {
    log.debug("User found: {}", user);
}
А ещё лучше — логируйте только то, что действительно нужно:

log.debug("User found: id={}, email={}", user.getId(), user.getEmail());
Так вы: - Уменьшите размер логов - Сохраните ценную информацию - Упростите разбор инцидентов в проде 📌 Советы: - INFO — для бизнес-событий (например, “заказ оформлен”) - DEBUG — для отладки - WARN и ERROR — для проблем, которые требуют внимания А ты проверял свои логи в проде? Не пора ли провести ревизию? 📲 Мы в MAX 👉@BookJava

🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП

🧪 Зачем Java-разработчику тестировать логику в SQL? Сегодня покажу вам полезный трюк для тех, кто пишет сложные запросы в PostgreSQL (или любом другом SQL-движке) и хочет их тестировать ещё до интеграции в Java-приложение. Если у тебя в проекте сложная логика в JOIN, CASE, оконных функциях или CTE — протестируй это на стороне базы, как обычную функцию. 🔹 Создаём функцию в PostgreSQL:

CREATE OR REPLACE FUNCTION test_discount(user_id INT)
RETURNS NUMERIC AS $$
BEGIN
  RETURN (
    SELECT 
      CASE 
        WHEN u.vip = true THEN 0.2
        ELSE 0.05
      END
    FROM users u WHERE u.id = user_id
  );
END;
$$ LANGUAGE plpgsql;
🔹 Проверяем прямо в базе:

SELECT test_discount(101); -- вернёт 0.2 или 0.05
✅ Это удобно, когда: - Ты хочешь протестировать ветки логики без запуска всего приложения; - У тебя CI/CD запускает SQL-тесты отдельно (через pgTAP, например); - Ты хочешь быстро показать запрос аналитику или тимлиду без Java-контекста. 💡 Лайфхак: если ты используешь Liquibase/Flyway — можно держать такие функции прямо в changelog'ах как test-only objects, не влияя на runtime-приложение. Попробуй — экономит массу времени на ревью и отладке запросов! 📲 Мы в MAX 👉@BookJava

🔐 Bouncy Castle: Легендарная криптография для Java Если вы разрабатываете на Java и вам нужно работать с шифрованием на серь
🔐 Bouncy Castle: Легендарная криптография для Java Если вы разрабатываете на Java и вам нужно работать с шифрованием на серьезном уровне, этот репозиторий - абсолютный мастхэв. Официальный репозиторий проекта Bouncy Castle (bc-java) - это настоящий швейцарский нож для любых криптографических задач. Стандартной реализации JCA/JCE (Java Cryptography Architecture / Extension) часто не хватает для сложных или специфических сценариев. Bouncy Castle блестяще решает эту проблему, предлагая как низкоуровневый (lightweight) криптографический API, так и полнофункциональный провайдер для JCE. 🛠 Главные возможности библиотеки: • Огромный выбор алгоритмов: От классических RSA, AES и ECC до различных национальных стандартов (включая ГОСТы) и экзотических шифров. • Постквантовая криптография (PQC): Библиотека идет в ногу со временем и активно внедряет постквантовые алгоритмы, устойчивые к будущим атакам с использованием квантовых компьютеров. • Инфраструктура открытых ключей (PKI): Мощнейшие и очень удобные API для генерации и обработки X.509 сертификатов, CRL, а также работа со стандартами CMS, S/MIME, OpenPGP, TSP, CMP, CRMF и OCSP. • Поддержка TLS/DTLS: Собственный независимый API для работы с защищенными сетевыми протоколами (вплоть до TLS 1.3). • Независимость от версии Java: Bouncy Castle поддерживает широкий спектр версий JVM, начиная с весьма старых (J2SE 1.5+) и заканчивая самыми современными. 💡 Когда это нужно? Bouncy Castle выручает там, где пасуют стандартные средства JDK. Нужно сгенерировать сложный сертификат «на лету», распарсить зашифрованное PGP-сообщение, использовать нестандартную эллиптическую кривую или реализовать защищенный протокол без привязки к конкретной ОС? Для всего этого используется Bouncy Castle. https://github.com/bcgit/bc-java 📲 Мы в MAX 👉@BookJava

🔥 Приглашаем на бесплатный открытый вебинар курса «Высоконагруженные системы: архитектура и масштабирование»: «Асинхронная о
🔥 Приглашаем на бесплатный открытый вебинар курса «Высоконагруженные системы: архитектура и масштабирование»: «Асинхронная обработка данных в высоконагруженных системах» 🗓 Когда: 16 июня, 20:00 (мск) На вебинаре разберём, как грамотно внедрять асинхронность и строить по-настоящему производительные системы. Что будет на вебинаре: — Зачем и когда переходить на асинхронную обработку данных в высоконагруженных проектах — Очереди сообщений, веб-сокеты и другие инструменты асинхронного взаимодействия — Реальный архитектурный кейс: от веб-сервера до брокера сообщений и базы данных — Типичные узкие места асинхронных систем и проверенные способы их устранения 👉 Зарегистрироваться: https://vk.cc/cYLGN5 Бесплатное занятие приурочено к курсу «Высоконагруженные системы: архитектура и масштабирование», где вы научитесь проектировать высоконагруженные системы, способные выдерживать экстремальные нагрузки и работать стабильно в любых условиях. 🎁При покупке курса вы получите в подарок мини-курс по Kafka, который поможет подготовиться к собеседованию в бигтех Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Сегодня я покажу вам простой, но мощный приём, который помогает упростить работу с коллекциями в Java — Collectors.collectingAndThen. Если вы когда-нибудь писали что-то вроде:

List<String> list = someStream
    .collect(Collectors.toList());
return Collections.unmodifiableList(list);
то collectingAndThen сделает это в одну строку:

List<String> list = someStream.collect(
    Collectors.collectingAndThen(
        Collectors.toList(),
        Collections::unmodifiableList
    )
);
Где это может пригодиться? – Возвращаете коллекцию из метода и не хотите, чтобы кто-то её изменял – Хотите обернуть результат в Optional, Set, Map, EnumMap и т.д. – Нужно после сбора в Stream ещё что-то сделать над результатом (например, отсортировать, фильтровать, обернуть) Ещё пример:

Optional<String> maxName = people.stream()
    .map(Person::getName)
    .collect(Collectors.collectingAndThen(
        Collectors.maxBy(Comparator.naturalOrder()),
        Optional::ofNullable
    ));
Этот метод часто остаётся в тени, но он может существенно упростить код и сделать его чище. Попробуйте использовать его в своём проекте 😉 📲 Мы в MAX 👉@BookJava

💡Совет: @TransactionalEventListener — это специализированная версия @EventListener, которая прослушивает событие и ждёт заве
💡Совет: @TransactionalEventListener — это специализированная версия @EventListener, которая прослушивает событие и ждёт завершения текущей транзакции, прежде чем сработать. Ожидание согласованного состояния базы данных позволяет безопаснее реагировать на изменения, внесённые в БД ✨ 📲 Мы в MAX 👉@BookJava

💡 Collection vs List в Java: в чём разница и когда что использовать Сегодня разберёмся с одним из самых популярных вопросов у джавистов: чем отличается Collection от List и когда что применять. 🔹 Collection — это базовый интерфейс всех коллекций в Java. Он описывает общие операции: add(), remove(), size(), contains() и т.д. 🔹 List — это подинтерфейс Collection, предназначенный для работы с упорядоченными списками. Дополнительно даёт методы: get(index), set(index, value), indexOf(), add(index, value). 🔧 Пример с Collection:

Collection<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");

for (String name : names) {
    System.out.println(name);
}
Здесь важно только наличие элементов — порядок и индексы не важны. 🔧 Пример с List:

List<String> cities = new ArrayList<>();
cities.add("Moscow");
cities.add("Berlin");
cities.add(1, "Paris");

System.out.println(cities.get(1)); // Paris
В этом случае нужен порядок и доступ по индексу — значит, выбираем List. 📌 Когда использовать что: - Используй Collection, если хочешь абстрагироваться от конкретной структуры и не используешь индексы. - Используй List, если: - важен порядок добавления, - нужен доступ по индексу, - требуется вставка в определённое место. 🧠 Совет: При проектировании методов или API лучше принимать Collection — так ты не ограничиваешь пользователя в реализации. А если внутри метода тебе нужны индексы — переходи на List. 📲 Мы в MAX 👉@BookJava