Всем привет! ????? Мы — Java-разработчики Т-Банка: Андрей, Арсений, Роман, Константин и Константин. Собираем интересные новости, статьи, туториалы и другие материалы из мира Java-разработки и делимся этим со всем сообществом.

В этом выпуске обозреваем Java 25. Смотрим на новые числовые типы, которые появятся в языке. Узнаем, что лучше: verify или clean install. Наблюдаем, как Spring продолжает обрастать новыми фичами. Изучаем сборщик мусора Shenandoah. В очередной раз убеждаемся, что чтение кода занимает куда больше времени, чем его написание. И еще много всего интересного. Приятного чтения ?

Java 25

25-я версия Java вышла в релиз 16 сентября.

В релиз попали JEPs:

  • 511: Module Import Declarations — конструкция, позволяющая импортировать целые модули. В перспективе значительно сократит количество импортов в файлах.

  • 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).

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 теперь можно использовать не только константы, но и паттерны.;

  • 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.

Спасибо за прочтение! Ждем обратной связи в комментариях. Увидимся через месяц ?

Присылайте материалы, если встретили что-то интересное, — опубликуем в следующем выпуске!

Комментарии (0)