Эволюция Java: от Java 8 до Java 27
За последние годы Java заметно изменилась: язык получил функциональные возможности, улучшенную производительность, новые инструменты для многопоточности и более удобный синтаксис.
Ключевые обновления по версиям:
• Java 8 (2014) — лямбда-выражения, Stream API, функциональные интерфейсы и новый API для работы с датой и временем.
• Java 11 (2018, LTS) — стандартный HTTP Client,
• Java 17 (2021, LTS) — sealed-классы, pattern matching для
• Java 21 (2023, LTS) — виртуальные потоки, record patterns, pattern matching для
• Java 24 (2025) — улучшения виртуальных потоков: JEP 491 позволяет синхронизированным виртуальным потокам не блокировать carrier threads.
• Java 25 (2025, LTS) — новая LTS-версия с улучшениями производительности, безопасности и стабильности.
• Java 27 (2026) — очередной этап развития платформы: новые возможности и улучшения производительности, многопоточности и удобства разработки.
Что важно разработчикам? Java давно перестала быть просто языком для корпоративных приложений. Виртуальные потоки упрощают работу с большим количеством параллельных задач, Stream API помогает обрабатывать коллекции, а современные версии языка делают код выразительнее.
Если вы используете Java в работе, стоит следить за новыми версиями — особенно за LTS-релизами, которые получают длительную поддержку.
👉 Java Portal
За последние годы Java заметно изменилась: язык получил функциональные возможности, улучшенную производительность, новые инструменты для многопоточности и более удобный синтаксис.
Ключевые обновления по версиям:
• Java 8 (2014) — лямбда-выражения, Stream API, функциональные интерфейсы и новый API для работы с датой и временем.
• Java 11 (2018, LTS) — стандартный HTTP Client,
var в параметрах лямбда-выражений и запуск однофайловых программ без предварительной компиляции.• Java 17 (2021, LTS) — sealed-классы, pattern matching для
instanceof и усиленная инкапсуляция внутренних API JDK.• Java 21 (2023, LTS) — виртуальные потоки, record patterns, pattern matching для
switch и sequenced collections.• Java 24 (2025) — улучшения виртуальных потоков: JEP 491 позволяет синхронизированным виртуальным потокам не блокировать carrier threads.
• Java 25 (2025, LTS) — новая LTS-версия с улучшениями производительности, безопасности и стабильности.
• Java 27 (2026) — очередной этап развития платформы: новые возможности и улучшения производительности, многопоточности и удобства разработки.
Что важно разработчикам? Java давно перестала быть просто языком для корпоративных приложений. Виртуальные потоки упрощают работу с большим количеством параллельных задач, Stream API помогает обрабатывать коллекции, а современные версии языка делают код выразительнее.
Если вы используете Java в работе, стоит следить за новыми версиями — особенно за LTS-релизами, которые получают длительную поддержку.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Вы можете использовать
✅ Указывает точный конструктор, который должен вызвать Jackson.
✅
✅ Отлично подходит для неизменяемых (immutable) типов — сеттеры не требуются.
👉 Java Portal
@JsonCreator, чтобы обеспечить предсказуемое преобразование JSON в Java-объекты.✅ Указывает точный конструктор, который должен вызвать Jackson.
✅
@JsonProperty явно связывает каждое поле JSON с соответствующим свойством объекта.✅ Отлично подходит для неизменяемых (immutable) типов — сеттеры не требуются.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Виртуальные потоки (Java 21) — простое объяснение:
Платформенный поток (Platform Thread) = один поток ОС. Он потребляет много ресурсов. Обычно можно создать тысячи таких потоков.
Виртуальный поток (Virtual Thread) = поток, управляемый JVM. Он гораздо легче, поэтому можно создавать миллионы таких потоков.
Лучше всего подходят для: операций с блокирующим вводом-выводом (I/O), например запросов к БД и HTTP-запросов.
Не решают проблему: ресурсоёмких вычислений (CPU-bound задач).
Главное: простой код и высокая параллельность.
👉 Java Portal
Платформенный поток (Platform Thread) = один поток ОС. Он потребляет много ресурсов. Обычно можно создать тысячи таких потоков.
Виртуальный поток (Virtual Thread) = поток, управляемый JVM. Он гораздо легче, поэтому можно создавать миллионы таких потоков.
Лучше всего подходят для: операций с блокирующим вводом-выводом (I/O), например запросов к БД и HTTP-запросов.
Не решают проблему: ресурсоёмких вычислений (CPU-bound задач).
Главное: простой код и высокая параллельность.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
💡 Виртуальные потоки (Virtual Threads) в Java 21 — лёгкие потоки, управляемые JVM.
✅ Не привязаны к потокам ОС по принципу 1:1, поэтому их можно создавать в огромном количестве.
✅ Создать виртуальный поток можно с помощью
✅ Лучше всего подходят для операций, связанных с ожиданием (I/O). Для ресурсоёмких вычислений по-прежнему лучше использовать пулы потоков.
👉 Java Portal
✅ Не привязаны к потокам ОС по принципу 1:1, поэтому их можно создавать в огромном количестве.
✅ Создать виртуальный поток можно с помощью
Thread.ofVirtual().start(...).✅ Лучше всего подходят для операций, связанных с ожиданием (I/O). Для ресурсоёмких вычислений по-прежнему лучше использовать пулы потоков.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Паттерны проектирования, которые действительно пригодятся в работе с Java:
- Builder — создание объектов с большим количеством необязательных полей.
- Factory — скрывает логику выбора и создания конкретного класса.
- Strategy — позволяет менять поведение, например использовать разные способы оплаты.
- Singleton — гарантирует наличие одного экземпляра объекта (Spring-бин по умолчанию тоже является Singleton в рамках своего контейнера).
- Observer — работа с событиями и слушателями.
- Adapter — позволяет использовать старый API через новый интерфейс.
- Decorator — добавляет функциональность, не изменяя исходный класс.
- Template Method — задаёт общую последовательность шагов, позволяя менять детали реализации.
Необязательно заучивать все паттерны из книги.
Изучите эти — и вы начнёте замечать их в коде, с которым уже работаете.
👉 Java Portal
- Builder — создание объектов с большим количеством необязательных полей.
- Factory — скрывает логику выбора и создания конкретного класса.
- Strategy — позволяет менять поведение, например использовать разные способы оплаты.
- Singleton — гарантирует наличие одного экземпляра объекта (Spring-бин по умолчанию тоже является Singleton в рамках своего контейнера).
- Observer — работа с событиями и слушателями.
- Adapter — позволяет использовать старый API через новый интерфейс.
- Decorator — добавляет функциональность, не изменяя исходный класс.
- Template Method — задаёт общую последовательность шагов, позволяя менять детали реализации.
Необязательно заучивать все паттерны из книги.
Изучите эти — и вы начнёте замечать их в коде, с которым уже работаете.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
💡 Webhook — это обычный POST-запрос, который ваше приложение получает, когда в другой системе происходит определённое событие.
✅ Создайте endpoint с
✅ Никакого polling (периодического опроса) — другая система сама отправляет запрос, когда событие происходит.
👉 Java Portal
✅ Создайте endpoint с
@PostMapping для получения данных события.✅ Никакого polling (периодического опроса) — другая система сама отправляет запрос, когда событие происходит.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Изучение внутреннего устройства Git — это одна из топ-5 вещей, которые разработчик может сделать для себя.
Вся суть Git внезапно сводится к коммитам в ветках, и тогда становится видно, насколько Git красив и прост по своей сути.
- rebase — это просто пересоздание коммитов на новой базе
- cherry-pick — это просто повторное применение изменений одного коммита
- merge — это просто соединение историй
- reset — это просто перемещение текущего ref’а
На самом деле это одна из самых красивых систем, когда-либо созданных.
👉 Java Portal
Вся суть Git внезапно сводится к коммитам в ветках, и тогда становится видно, насколько Git красив и прост по своей сути.
- rebase — это просто пересоздание коммитов на новой базе
- cherry-pick — это просто повторное применение изменений одного коммита
- merge — это просто соединение историй
- reset — это просто перемещение текущего ref’а
На самом деле это одна из самых красивых систем, когда-либо созданных.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1
Harness Engineering для Java- и Spring Boot-приложений
В статье рассматриваются инструменты и практики для контроля качества и проверки архитектуры приложений:
- Форматирование и проверка кода
- Анализ покрытия кода и качества с помощью JaCoCo и SonarQube
- Проверка архитектуры с помощью ArchUnit и Taikai
- Контроль границ модулей с помощью Spring Modulith
- Анализ работы приложения во время выполнения с помощью BootUI
👉 Java Portal
В статье рассматриваются инструменты и практики для контроля качества и проверки архитектуры приложений:
- Форматирование и проверка кода
- Анализ покрытия кода и качества с помощью JaCoCo и SonarQube
- Проверка архитектуры с помощью ArchUnit и Taikai
- Контроль границ модулей с помощью Spring Modulith
- Анализ работы приложения во время выполнения с помощью BootUI
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
💡 Нужны тестовые данные в базе? Используйте
Эта аннотация позволяет запускать SQL-скрипты перед тестами или после их выполнения.
✅ Загружает SQL-скрипты из
✅ Позволяет хранить тестовые данные в отдельных
✅ Работает с
👉 Java Portal
@Sql в Java!Эта аннотация позволяет запускать SQL-скрипты перед тестами или после их выполнения.
✅ Загружает SQL-скрипты из
classpath перед или после каждого тестового метода✅ Позволяет хранить тестовые данные в отдельных
.sql-файлах, не загромождая Java-код✅ Работает с
@SpringBootTest и @DataJpaTestPlease open Telegram to view this post
VIEW IN TELEGRAM
👍4
🚀 Совет по Spring:
Аннотация
👉 Java Portal
@Fallback — альтернативный выбор бинаАннотация
@Fallback позволяет Spring выбрать резервный бин, если доступные бины не имеют статуса @Primary.Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
💡 Проверяете индекс массива? Используйте
✅ Заменяет ручные проверки
✅ Выбрасывает
✅ Также полезны методы
👉 Java Portal
Objects.checkIndex() (Java 9+).✅ Заменяет ручные проверки
if (i < 0 || i >= size)✅ Выбрасывает
IndexOutOfBoundsException с понятным сообщением✅ Также полезны методы
checkFromToIndex() и checkFromIndexSize() для проверки диапазоновPlease open Telegram to view this post
VIEW IN TELEGRAM
❤3
Хеширование vs шифрование vs кодирование
Эти три понятия часто путают в разработке. Все они могут преобразовывать данные в другое представление, но предназначены для совершенно разных задач.
Главный вопрос: что вы хотите сделать — проверить данные, защитить их или просто изменить способ их представления?
Короткая шпаргалка:
• Hashing (хеширование) → преобразование в одну сторону.
• Encryption (шифрование) → обратимое преобразование с помощью ключа.
• Encoding (кодирование) → обратимое преобразование без секретного ключа.
1. Хеширование (Hashing). Хеширование преобразует входные данные в хеш фиксированной длины.
Пример на Java:
Практически невозможно восстановить исходные данные из надёжного криптографического хеша.
Где используется:
• Проверка целостности данных.
• Хранение паролей (с помощью специализированных алгоритмов хеширования паролей).
• Цифровые подписи.
• Проверка файлов.
<text color="warning" weight="medium">⚠️</text> Для хранения паролей следует использовать Argon2id, bcrypt, scrypt или PBKDF2 с подходящими солью и параметрами, а не обычный SHA-256.
Запомните: можно ли проверить данные, не восстанавливая оригинал?
2. Шифрование (Encryption). Шифрование преобразует читаемые данные в зашифрованный текст с помощью криптографического ключа.
Например:
С правильным ключом исходные данные можно восстановить.
Где используется:
• Защита конфиденциальных данных.
HTTPS/TLS.
• Шифрование баз данных.
• Безопасная передача информации.
• Защита файлов.
Запомните: данные должны оставаться секретными, но при необходимости их можно восстановить.
3. Кодирование (Encoding). Кодирование преобразует данные в другое представление. Это не механизм обеспечения безопасности.
Пример на Java:
Где используется:
• Base64.
• URL-кодирование.
• Форматы сериализации данных.
• Передача бинарных данных в текстовом виде.
Запомните: меняется представление данных, а не уровень их защиты.
Распространённые заблуждения:
• Base64 — это шифрование.
• Хеширование — это шифрование.
• Зашифрованные данные невозможно расшифровать.
• SHA-256 сам по себе подходит для хранения паролей.
Всё это неверно.
Пример из реальной разработки: Представим, что нужно сохранить пароль пользователя:
• Хеширование: сохраняем надёжный хеш пароля и используем его для проверки при входе.
• Шифрование: защищаем данные, которые в дальнейшем потребуется расшифровать.
• Кодирование: преобразуем данные в формат, удобный для передачи.
Главное, что нужно запомнить:
• Hashing → Проверить.
• Encryption → Защитить.
• Encoding → Представить.
Если нужна конфиденциальность — используйте шифрование. Если нужно проверить целостность — хеширование. Если требуется изменить представление данных — кодирование.
👉 Java Portal
Эти три понятия часто путают в разработке. Все они могут преобразовывать данные в другое представление, но предназначены для совершенно разных задач.
Главный вопрос: что вы хотите сделать — проверить данные, защитить их или просто изменить способ их представления?
Короткая шпаргалка:
• Hashing (хеширование) → преобразование в одну сторону.
• Encryption (шифрование) → обратимое преобразование с помощью ключа.
• Encoding (кодирование) → обратимое преобразование без секретного ключа.
1. Хеширование (Hashing). Хеширование преобразует входные данные в хеш фиксированной длины.
Вход: Hello123
↓
SHA-256
↓
Хеш: 64-символьное шестнадцатеричное значение
Пример на Java:
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(
"Hello123".getBytes(StandardCharsets.UTF_8)
);Практически невозможно восстановить исходные данные из надёжного криптографического хеша.
Где используется:
• Проверка целостности данных.
• Хранение паролей (с помощью специализированных алгоритмов хеширования паролей).
• Цифровые подписи.
• Проверка файлов.
<text color="warning" weight="medium">⚠️</text> Для хранения паролей следует использовать Argon2id, bcrypt, scrypt или PBKDF2 с подходящими солью и параметрами, а не обычный SHA-256.
Запомните: можно ли проверить данные, не восстанавливая оригинал?
2. Шифрование (Encryption). Шифрование преобразует читаемые данные в зашифрованный текст с помощью криптографического ключа.
Исходный текст
↓
Шифрование + ключ
↓
Шифротекст
↓
Расшифровка + ключ
↓
Исходный текст
Например:
Вход: AccountNumber123
Выход: Зашифрованный текст
С правильным ключом исходные данные можно восстановить.
Где используется:
• Защита конфиденциальных данных.
HTTPS/TLS.
• Шифрование баз данных.
• Безопасная передача информации.
• Защита файлов.
Запомните: данные должны оставаться секретными, но при необходимости их можно восстановить.
3. Кодирование (Encoding). Кодирование преобразует данные в другое представление. Это не механизм обеспечения безопасности.
Вход: Hello
↓
Base64 Encoding
↓
SGVsbG8=
↓
Base64 Decoding
↓
Hello
Пример на Java:
String encoded = Base64.getEncoder()
.encodeToString("Hello".getBytes());
String decoded = new String(
Base64.getDecoder().decode(encoded)
);
Где используется:
• Base64.
• URL-кодирование.
• Форматы сериализации данных.
• Передача бинарных данных в текстовом виде.
Запомните: меняется представление данных, а не уровень их защиты.
Распространённые заблуждения:
• Base64 — это шифрование.
• Хеширование — это шифрование.
• Зашифрованные данные невозможно расшифровать.
• SHA-256 сам по себе подходит для хранения паролей.
Всё это неверно.
Пример из реальной разработки: Представим, что нужно сохранить пароль пользователя:
MySecret123• Хеширование: сохраняем надёжный хеш пароля и используем его для проверки при входе.
• Шифрование: защищаем данные, которые в дальнейшем потребуется расшифровать.
• Кодирование: преобразуем данные в формат, удобный для передачи.
Главное, что нужно запомнить:
• Hashing → Проверить.
• Encryption → Защитить.
• Encoding → Представить.
Если нужна конфиденциальность — используйте шифрование. Если нужно проверить целостность — хеширование. Если требуется изменить представление данных — кодирование.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
💡 Не отправляйте
✅ Исключает из ответа свойства, значение которых равно
✅ Делает JSON чище для клиентов и уменьшает размер ответа.
✅ Аннотацию можно добавить к классу или отдельному полю, а также настроить глобально через Jackson.
👉 Java Portal
null-поля в JSON — используйте @JsonInclude(NON_NULL).✅ Исключает из ответа свойства, значение которых равно
null.✅ Делает JSON чище для клиентов и уменьшает размер ответа.
✅ Аннотацию можно добавить к классу или отдельному полю, а также настроить глобально через Jackson.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Отличная шпаргалка для разработчиков, которые регулярно работают с Git.
Создание коммитов, переключение между ветками, разрешение конфликтов, отмена изменений, работа с удалёнными репозиториями и история проекта.
80 команд с короткими пояснениями и примерами.
👉 Java Portal
Создание коммитов, переключение между ветками, разрешение конфликтов, отмена изменений, работа с удалёнными репозиториями и история проекта.
80 команд с короткими пояснениями и примерами.
Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Нужен бин только для тестов? Используйте
✅ Позволяет объявлять бины, которые загружаются только в тестах и не попадают в production.
✅ Можно объявить конфигурацию внутри тестового класса или явно подключить её через
✅ Безопаснее, чем размещать фейковые реализации в
👉 Java Portal
@TestConfiguration.✅ Позволяет объявлять бины, которые загружаются только в тестах и не попадают в production.
✅ Можно объявить конфигурацию внутри тестового класса или явно подключить её через
@Import.✅ Безопаснее, чем размещать фейковые реализации в
src/main.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Аутентификация и авторизация (OAuth, JWT, Sessions)
Что такое аутентификация (Authentication)?
Аутентификация — это процесс проверки личности пользователя или системы. Она подтверждает, что человек или приложение, пытающееся получить доступ к системе, действительно является тем, за кого себя выдаёт.
→ Пример: вход в систему с помощью логина и пароля.
Что такое авторизация (Authorization)?
Авторизация определяет, какие действия может выполнять аутентифицированный пользователь внутри системы. Она задаёт права и уровни доступа.
→ Пример: обычный пользователь может просматривать контент, а администратор — добавлять и удалять его.
OAuth (Open Authorization):
→ Стандартный протокол для делегирования доступа с помощью токенов.
→ Позволяет пользователям входить через сторонних провайдеров, например Google, Facebook или GitHub.
→ Пример: кнопка «Войти через Google» на сайте.
JWT (JSON Web Token):
→ Компактный формат токенов, используемый для передачи данных аутентификации.
→ Содержит закодированную информацию о пользователе и имеет цифровую подпись для проверки целостности.
→ Часто применяется в stateless-аутентификации, когда сервер не хранит данные сессии.
→ Пример: после входа сервер выдаёт JWT, который клиент отправляет с каждым запросом.
Sessions (Сессии):
→ Метод, при котором сервер временно хранит данные об аутентификации пользователя.
→ Идентификатор сессии сохраняется в браузере клиента (обычно в cookie) и связывается с данными на сервере.
→ Пример: классические веб-приложения, в которых пользователь остаётся авторизованным до истечения срока действия сессии или выхода из системы.
Ключевые отличия:
→ OAuth: делегирует доступ внешним провайдерам.
→ JWT: позволяет передавать данные аутентификации в токенах без хранения состояния сессии на сервере.
→ Sessions: используют состояние, храня данные сессии на сервере.
Примеры из реальной разработки:
→ OAuth: вход в Spotify через Facebook или Google.
→ JWT: API, в которых клиенты проходят аутентификацию с помощью токенов.
→ Sessions: классические веб-приложения на PHP или Node.js с системой входа.
👉 Java Portal
Что такое аутентификация (Authentication)?
Аутентификация — это процесс проверки личности пользователя или системы. Она подтверждает, что человек или приложение, пытающееся получить доступ к системе, действительно является тем, за кого себя выдаёт.
→ Пример: вход в систему с помощью логина и пароля.
Что такое авторизация (Authorization)?
Авторизация определяет, какие действия может выполнять аутентифицированный пользователь внутри системы. Она задаёт права и уровни доступа.
→ Пример: обычный пользователь может просматривать контент, а администратор — добавлять и удалять его.
OAuth (Open Authorization):
→ Стандартный протокол для делегирования доступа с помощью токенов.
→ Позволяет пользователям входить через сторонних провайдеров, например Google, Facebook или GitHub.
→ Пример: кнопка «Войти через Google» на сайте.
JWT (JSON Web Token):
→ Компактный формат токенов, используемый для передачи данных аутентификации.
→ Содержит закодированную информацию о пользователе и имеет цифровую подпись для проверки целостности.
→ Часто применяется в stateless-аутентификации, когда сервер не хранит данные сессии.
→ Пример: после входа сервер выдаёт JWT, который клиент отправляет с каждым запросом.
Sessions (Сессии):
→ Метод, при котором сервер временно хранит данные об аутентификации пользователя.
→ Идентификатор сессии сохраняется в браузере клиента (обычно в cookie) и связывается с данными на сервере.
→ Пример: классические веб-приложения, в которых пользователь остаётся авторизованным до истечения срока действия сессии или выхода из системы.
Ключевые отличия:
→ OAuth: делегирует доступ внешним провайдерам.
→ JWT: позволяет передавать данные аутентификации в токенах без хранения состояния сессии на сервере.
→ Sessions: используют состояние, храня данные сессии на сервере.
Примеры из реальной разработки:
→ OAuth: вход в Spotify через Facebook или Google.
→ JWT: API, в которых клиенты проходят аутентификацию с помощью токенов.
→ Sessions: классические веб-приложения на PHP или Node.js с системой входа.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Совет по конфигурации Spring Boot:
Не прописывайте значения окружения напрямую в коде.
•
•
•
• Секреты → переменные окружения или менеджер секретов
Используйте
👉 Java Portal
Не прописывайте значения окружения напрямую в коде.
•
application.yml → значения по умолчанию•
application-dev.yml → настройки для dev-окружения•
application-prod.yml → настройки для prod-окружения• Секреты → переменные окружения или менеджер секретов
Используйте
@ConfigurationProperties для типизированной конфигурации вместо того, чтобы повсюду применять @Value.Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🤣2