
Всем привет! ????? Мы — Java-разработчики Т-Банка: Андрей, Арсений, Роман, Константин и Константин. Собираем интересные новости, статьи, туториалы и другие материалы из мира Java-разработки и делимся этим со всем сообществом.
В этом выпуске обозреваем Java 25. Смотрим на новые числовые типы, которые появятся в языке. Узнаем, что лучше: verify или clean install. Наблюдаем, как Spring продолжает обрастать новыми фичами. Изучаем сборщик мусора Shenandoah. В очередной раз убеждаемся, что чтение кода занимает куда больше времени, чем его написание. И еще много всего интересного. Приятного чтения ?
Java 25
25-я версия Java вышла в релиз 16 сентября.
В релиз попали JEPs:
511: Module Import Declarations — конструкция, позволяющая импортировать целые модули. В перспективе значительно сократит количество импортов в файлах.
512: Compact Source Files and Instance Main Methods. Позволяет лаконичнее писать main-классы и методы. Java еще на шаг ближе к скриптовому языку ?
513: Flexible Constructor Bodies. Теперь в конструкторах до super(...) и this(...) можно вызывать некоторые выражения и функции. Полезно обновить свои знания для собеседований ?
506: Scoped Values. Аналог ThreadLocal, но имеет более гибкое и богатое API. И в отличие от ThreadLocal работает с виртуальными потоками.
519: Compact Object Headers. Размеры заголовков объектов уменьшились с 96/128 до 64 бит на 64-битных платформах. Позволяет из коробки сэкономить много места в хипе. Пока отключен по умолчанию, нужно явно включать флагом.
521: Generational Shenandoah. Поколенческий режим GC Shenandoah вышел из экспериментального статуса. В этом режиме хип делится на два поколения: молодое и старое. Для сборки применяются те же алгоритмы, просто Shenandoah работает в основном на молодом поколении, иногда захватывая старое.
514: Ahead-of-Time Command-Line Ergonomics. AOT-кэш теперь создается за одну команду, а не за две. Мелочь, а приятно ?
515: Ahead-of-Time Method Profiling. Добавление профилей методов в AOT-кэши. Это нужно для еще более эффективного прогрева приложения и, как следствие, более быстрого старта.
518: JFR Cooperative Sampling. Сэмплирование в JFR стало стабильнее из-за того, что снятие стек-трейсов теперь происходит только в сейф-поинтах. Это достигнуто за счет кооперативного подхода, при котором запрос на семплирование выполняется не сразу, а записывается в локальную очередь целевого потока. Поток выполнит его, только дойдя до сейф-пойнта.
520: JFR Method Timing & Tracing. Новый механизм в JFR. Позволяет сохранять полную и точную информацию по таймингам вызова и трассировки конкретных методов.
510: Key Derivation Function API. Новое API для выведения криптографически сильных секретных ключей. Пока доступна только реализация HKDF (HMAC-based Extract-and-Expand Key Derivation Function).
503: Remove the 32-bit x86 Port. Начиная с этого релиза JDK, больше нельзя будет собрать 32-битный x86.
JEPs в Preview, Experimental и Incubator:
502: Stable Values (Preview) — API для lazy-инициализации. С помощью класса-обертки StableValue можно будет задать иммутабельную переменную или поле, значение которой инициализируется единожды при первом вызове через метод orElseSet.
505: Structured Concurrency (Fifth Preview) — API для реализации подхода Structured Concurrency. В этом превью StructuredTaskScope теперь может инициализироваться только через перегрузки статического метода open.
507: Primitive Types in Patterns, instanceof, and switch (Third Preview). Реализация использования примитивных типов в паттернах, instanceof и switch. В этом превью стали доступны для использования все примитивные типы, и в ветках switch теперь можно использовать не только константы, но и паттерны.;
470: PEM Encodings of Cryptographic Objects (Preview) — API для кодирования криптографических объектов в формате PEM.
509: JFR CPU-Time Profiling (Experimental). В JFR появилось профилирование времени CPU для Linux.
508: Vector API (Tenth Incubator). Внутреннее API для векторных вычислений. Все еще ждет Valhalla и переходит в 10-й инкубатор. С юбилеем! ???
Еще немного классных материалов о новом релизе
По традиции на канале Java прошел стрим, посвященный релизу, — Java 25 Launch Stream.
Видео о новом релизе:
What’s New in Java 25 in 2 Minutes... More or Less - Sip of Java
What’s New in JDK 25? Full Release Notes Breakdown - Inside Java Newscast #98
Рекомендуем плейлист Road to 25: в нем подробно рассказано обо всех новых фичах в сравнении с Java 21 и как организовать миграцию на новую версию.
От компании Oracle вышла шпаргалка, в которой показывают, какие JEPs были добавлены в JDK с 21-й по 25-ю версии. Отлично подойдет тем, кто хочет быстро посмотреть основные изменения.
На Хабре уже вышла статья с детальным обзором: «Вышла Java 25». Огромное спасибо автору за труд! ?
Релиз действительно выдающийся. Из Preview вышло очень много крутых фич. Желаем команде, работающей над нашим любимым языком, дальнейших успехов и новых свершений! ???
Горячие JEPs
JEP 504: Remove the Applet API направлен в JDK26, и апплеты официально отправляются на покой.
JEP 522: G1 GC: Improve Throughput by Reducing Synchronization повышен в статусе с Proposed to Target до Targeted для JDK 26. В этом JEP предлагается сократить накладные расходы сборщика мусора G1 за счет улучшения синхронизации между потоками приложения и потоками GC.
JEP 500: Prepare to Make Final Mean Final. Был повышен в статусе с JEP Draft 8349536 до Candidate. В этом JEP предлагается подготовить экосистему Java к тому, что больше не будет разрешаться изменять поля, объявленные как final, с помощью «глубокой рефлексии», которая обычно выполняется через метод setAccessible(), определенный в классе AccessibleObject.
Главные новости
Detaching GraalVM from the Java Ecosystem Train. Oracle объявляет, что GraalVM перестает быть частью Java SE-продуктов, начиная с JDK 25, — дальше он будет развиваться отдельно от стандартного релизного цикла Java.
При этом команда GraalVM планирует сконцентрироваться на языках, не связанных напрямую с Java: GraalPy, GraalJS и другими. А многие оптимизации, связанные со стартап-производительностью и AOT, переносятся в рамки Project Leyden в OpenJDK. Как отметил руководитель проекта, GraalVM никуда не уходит и продолжит развиваться.

Интересные видео
Paths to Support Additional Numeric Types on the Java Platform #JVMLS Доклад Джо Дарси на #JVMLS показывает, зачем Java нужны новые числовые типы — от complex и decimal до float16 — и какие вызовы стоят перед языком, JVM и библиотеками. Если хотите понять, как строгая математика соединяется с практикой платформы и куда движется Java, этот материал стоит посмотреть.
Полезные статьи
Maven: verify или clean install? Спойлер: clean install ? Но, как обычно, все зависит от контекста. Статья полезна тем, что хорошо раскрывает, как работают соответствующие команды. Автор проводит замеры на разных проектах и показывает, какой выигрыш в скорости и использовании дискового пространства может дать verify. Это особенно видно на проектах с большим количеством взаимосвязанных модулей.
HTTP Service Client Enhancements. Новый механизм HTTP-клиентов в Spring предоставляет декларативный способ регистрации и конфигурации клиентов через HttpServiceRegistry. Это позволяет централизованно управлять настройками и автоматически создавать прокси-клиенты для сервисов через аннотации или интерфейсы, сокращая шаблонный код и улучшая интеграцию с Spring-экосистемой. Например, поддержка Circuit Breaker, OAuth.
API Versioning in Spring. Статья API Versioning in Spring представляет новый встроенный механизм версионирования API в Spring Framework 7. Автор описывает, как через интерфейсы ApiVersionStrategy и ApiVersionConfigurer можно конфигурировать способ определения версии. Рассказывает, как использовать атрибут version в аннотациях @RequestMapping, @GetMapping и @HttpExchange. При этом компонент ApiVersionInserter автоматически вставляет нужную версию в запросы со стороны клиента.
Core Spring Resilience Features: @ConcurrencyLimit, @Retryable, and RetryTemplate. В Spring Framework 7.0 появляются встроенные механизмы устойчивости: @ConcurrencyLimit для ограничения параллельных вызовов и @Retryable для автоматических повторов. Ранее @Retryable был частью внешнего проекта Spring Retry, но теперь становится базовой возможностью ядра Spring, что избавляет от необходимости подключать дополнительные зависимости.
JDK 25 Security Enhancements рассказывает о ключевых улучшениях безопасности в JDK 25. Читатели узнают о новых API для работы с криптографическими объектами в формате PEM, об окончательной версии API для получения ключей, о поддержке новых алгоритмов и других изменениях, которые повысят безопасность и производительность приложений.
JavaFX 25 Highlights рассказывает о новых функциях JavaFX 25, среди которых элементы управления в заголовке окна, улучшения RichTextArea, медиазапросы в CSS, TabStopPolicy для TextFlow и новые API для работы с текстом. Будет полезна разработчикам, работающим с JavaFX и создающим GUI на Java.
Путеводитель для начинающих по сборщику мусора Shenandoah рассказывает о ключевых характеристиках, принципах работы и сценариях использования. Материал полезен разработчикам, которые хотят понять, как работает Shenandoah и где его можно применить.
Google's Agent Development Kit for Java Adds Integration with LangChain4j об обновлении ADK для Java до версии 0.2.0 с интеграцией LangChain4j. С ней можно использовать различные LLM: OpenAI, Anthropic, Mistral и другие. Будет полезна Java-разработчикам, архитекторам ПО и специалистам по мультиагентным системам.
Любопытные подкасты
Episode 40 «Amber & Valhalla — Incremental Design and Feature Arcs» with Brian Goetz. Brian Goetz и Nicolai Parlog обсуждают философию развития Java через постепенные шаги — так называемые feature arcs. Brian Goetz, архитектор языка Java в Oracle и руководитель проектов Project Amber и Project Valhalla, делится своими мыслями насчет будущих инициатив.
Просто интересное
Scalable Thread-Safety Analysis of Java Classes with CodeQL. Работа предлагает масштабируемый статический анализ на предмет потокобезопасности (thread-safety) для Java-классов, реализованный через CodeQL. Исследование проанализировало миллионы классов, выявило проблемы, и PRs уже отправлены в проекты.
GitHub Copilot-backed app modernization available for Java, .NET. GitHub Copilot расширяет возможности для Java: теперь доступна фича app modernization — она помогает автоматизировать миграции и рефакторинг легаси-кода.

Роман
В последнее время явно заметен тренд на автоматизацию работы с легаси, миграцией одного ЯП в другой и прочим. Кто знает, может быть, через пару лет у нас не останется брошенных монолитов ?
Writing Code Is Easy. Reading It Isn’t. База. AI может генерировать очень много кода очень быстро. Основные усилия в программировании уходят не на написание кода, а на его чтение и понимание, на составление ментальной модели системы у себя в голове. А чем кода больше, чем он запутаннее, тем сложнее это делать. Нужно больше думать о том, как ускорить понимание кода, а не его написание. А это гораздо сложнее.
Джавовые события
Joker 2025 пройдет 17 и 18 октября 2025 в Санкт-Петербурге (с онлайн-участием). В программе — доклады про «горячие JEPs 25», архитектуру JVM, Spring, языковые фичи и многое другое.
Свежие релизы
Вышел Quarkus 3.28.1, включающий улучшения производительности при сборке, новые API безопасности (например, программный CSRF), поддержку множественных клиентов для MongoDB через Liquibase и прочие улучшения.
Подробнее — в примечаниях к выпуску.
Команда TorandoVM представила первую интеграцию GPULlama3.java с LangChain4j. Теперь разработчики могут компилировать и запускать Java-инференс-модели на GPU с помощью TornadoVM для Llama3, Mistral AI, Qwen AI и Phi3. Раньше приходилось использовать Python-обвязки для запуска модели, а Java жила максимум в роли «клиента» к этим моделям. Сейчас же можно компилировать Java-код с вызовами inference прямо в GPU-инструкции.
Формальный релиз LangChain4j 1.5.0 включает в себя следующие изменения:
реализацию клиента для MCP Registry;
поддержку генерации изображений через Gemini;
поддержку concurrent tool calling через AI-агента.
Подробнее об этом релизе можно узнать в release notes.
Вместе с выходом JDK 25 подразделение Oracle Labs выпустило GraalVM для JDK 25. Появилась расширенная поддержка JEP 454 и Foreign Function & Memory API (FFM) с новым синтаксисом для конфигурирования FFM API и реализацией метода ofShared(), определенного в интерфейсе Arena. А еще — реализация оптимизационных операций из JEP 338, Vector API (Incubator). Дополнительные подробности можно найти в release notes..
Первый milestone-релиз Spring AI 1.1.0 несет исправления ошибок, улучшения документации, обновления зависимостей и новые функции:
рефакторинг модулей автоконфигурации на сервере MCP с переходом на протокольно-ориентированный подход к конфигурации;
добавление поддержки конфигурации на основе аннотаций для клиентов и сервера MCP.
Подробности — в release notes.
Шестой и последний milestone-релиз Spring Data 2025.1.0 добавляет поддержку: Spring Framework 7, Jakarta Persistence 3.2 и Jakarta Servlet 6.1 в составе Jakarta EE 11, Kotlin 2.2 и недавно вышедшего Jackson 3.0.
Среди новых возможностей:
расширенное использование Jakarta Persistence Query Language (JPQL) с целью полного замещения интерфейса QueryCriteria;
поддержка составных идентификаторов (composite IDs / composite keys) в подпроектах Spring Data JDBC и Spring Data R2DBC для более корректного маппинга сущностей с атрибутами под каждый столбец в составном ID.
Более детальная информация, включая breaking changes, доступна в release notes.
Спасибо за прочтение! Ждем обратной связи в комментариях. Увидимся через месяц ?
Присылайте материалы, если встретили что-то интересное, — опубликуем в следующем выпуске!