Всем привет! ? ? ??

Мы — Java-разработчики Тинькофф: Андрей, Арсений, Константин и Константин — наша команда выросла на целого Костю. Собираем интересные новости, статьи, туториалы и другие материалы из мира Java-разработки теперь на 25% больше и делимся этим со всем сообществом.

Главная новость прошедшего месяца: вышла Java 22. В этом выпуске мы собрали много материалов на эту тему: обзоры JEP, видео и статьи, посвященные изменениям. Будут обзоры о новых релизах и дорожная карта Ktor. Нашлось место туториалам, посещенным Testcontainers, ExecutorService, Spring и Java NIO. Кстати, 24 марта Spring 1.0 исполнилось 20 лет — на эту тему тоже есть интересный материал. Приятного чтения ?

Вышла Java 22

Новое в Java 22:

JEP 423: Region Pinning for G1. Добавляет закрепление региона памяти для G1, позволяя совершать сборку мусора в регионах с объектами, используемыми JNI.

JEP 454: Foreign Function & Memory API. Завершает работу над API внешних функций и памяти, улучшая производительность и пользовательский опыт разработчиков.

JEP 456: Unnamed Variables & Patterns. Позволяет заменять подчеркиванием переменные и шаблоны, которые вы не собираетесь использовать. Это не только снижает сложность кода, но и улучшает его восприятие.

JEP 458: Launch Multi-File Source-Code Programs. Запускает программы с несколькими файлами исходного кода, позволяет Java Launcher компилировать и запускать несколько файлов исходного кода — это улучшение по сравнению с JEP 330 для запуска программ с одним файлом исходного кода.


JEP, доступные в режиме preview:

JEP 447: Statements before super(...). Позволяет добавлять инструкции перед вызовом super в конструкторах. Это дает разработчикам возможность добавлять проверку или другую обработку переменных перед вызовом родительского конструктора.

JEP 457: Class-File API. Предоставляет стандартный API для файлов классов. Маловероятно, что большинство разработчиков будут взаимодействовать с API для файлов классов напрямую, но смогут улучшить процесс обновления между версиями JDK.

JEP 461: Stream Gatherers. Stream Gatherer — инструмент для определения разработчиком кастомных промежуточных операций для Stream API. По сути, прямой аналог коллекторов для терминальных операций. Несколько газереров идут из коробки: fold, mapConcurrent, scan, windowFixed, windowSliding.

JEP 463: Implicitly Declared Classes and Instance Main Methods. Второе preview JEP 445, неназванных классов и основных методов экземпляра. JEP содержит изменения правил для неявного объявления классов в исходных файлах и процедуры выбора основного метода для вызова.

JEP 459 String Templates, 462 Structured Concurrency и 464 Scoped Values находятся во второй итерации preview и содержат незначительные изменения API или вообще не содержат их.

А также РЕКОРД, ведь ни один JEP еще не был в стадии инкубатора так долго:

JEP 460 Vector API — векторный API, единственная функция инкубатора с седьмой итерацией статуса инкубатора. Vector API продолжит оставаться в статусе инкубатора в ожидании выпуска функций project Valhalla.

Дополнительные материалы:

Короткий обзор фич за 2 минуты:

Более полный обзор изменений:

Запись стрима на официальном канале, приуроченного к релизу:

Java 22 and IntelliJ IDEA — обзор фич с упором на их поддержку в IntelliJ IDEA 2024.1.

Java 22 Is Here, And It’s Ready To Rock — еще один обзор всех фич Java 22. Сам материал хорошо структурирован, все фичи сгруппированы по принадлежности к проекту JDK или конкретному аспекту Java. Большой плюс, что для всех фич есть примеры использования и список изменений относительно Java 21.

Усовершенствование безопасности JDK 22. Содержит улучшения безопасности, сгруппированные по категориям: крипто, TLS и так далее. Новая категория безопасности добавлена для параметра Java -XshowSettings. Интерфейс AsymmetricKey обеспечивает реализацию по умолчанию и упрощает извлечение параметров из ключей. Новые сертификаты корневого центра сертификации добавлены в хранилище ключей Cacerts. Дополнительные системные свойства для управления максимальной длиной цепочек сертификатов клиента и сервера добавлены в JDK. А также многое другое вы найдете в этой статье.

Главные новости

Совет пользователям Java на macOS 14. Тем, кто работает на системах Apple Silicon, следует пропустить macOS 14.4 и обновиться до macOS 14.4.1. Apple выпустила macOS 14.4.1, устраняя проблему неожиданного завершения процесса Java. Проблема затрагивает все версии Java, начиная с Java 8 и заканчивая сборками JDK 22. Для раннего доступа macOS на процессорах Apple Silicon включает функцию управления динамически генерируемым кодом. В macOS 14.4 при доступе к защищенной области памяти вместо сигнала SIGBUS или SIGSEGV отправляется сигнал SIGKILL. Виртуальная машина Java генерирует код динамически и использует механизм сигналов защищенного доступа к памяти. В macOS 14.4 вместо обработки сигнала программы завершают работу. Oracle рекомендует пользователям Java на устройствах Apple на базе ARM пропустить macOS 14.4 и обновиться до macOS 14.4.1.

AtomicJar is now part of Docker! Компания AtomicJar занимается разработкой Testcontainers и становится частью компании Docker. Компании сотрудничали давно, в частности примеры Testcontainers можно найти в официальной документации Docker. Теперь же сами Testcontainers, Testcontainers Desktop и Testcontainers Cloud станут полноценной частью экосистемы Docker. 

The Ktor Roadmap for 2024. JetBrains опубликовали roadmap развития фреймворка Ktor в 2024 году. Из интересного: поддержка OpenTelemetry, gRPC, managed транзакций, а также официальные гайдлайны по использованию DI-библиотек.

Вышла версия Jmix 2.2. Haulmont выпустили новую версию Jmix — платформы для быстрой разработки B2B-веб-приложений на Java. Главное нововведение: Jmix Studio бесплатна для небольших проектов.

Spring Modulith 1.2 M3 released. Релиз Spring Modulith 1.2 M3 принес поддержку открытых модулей, также добавили возможность использовать аннотации уровня конфигураций пакетов для котлина.

Gradle 8.7 Released вышел и принес с собой поддержку Java 22.

Интересные видео

Performance oriented Spring Data JPA & Hibernate by Maciej Walkowiak. Затрагивается проблема производительности наших любимых JPA & Hibernate. Не обошлось без N+1, а еще рассказали про менеджмент соединений, транзакции, инструменты оптимизации и анализа и не только.

Jocker 2023. Через несколько недель пройдет конференция JPoint 2024, а пока JUG.RU опубликовали записи докладов с Jocker 2023. Такое мы смотрим ?

Полезные статьи

MethodHandle primer. Есть обзор API, расположенного в пакете java.lang.invoke. Разобраны наиболее часто используемые фичи рефлексии и кодогенерации. Статья дает хорошую точку для входа в понимание рефлексии, чтобы дальше самостоятельно погрузиться в тему.

Настраиваем ExecutorService на практике. Подробно о том, что такое ExecutorService’ы в Java, зачем они нужны, как их настраивать и какие подводные камни вас ждут при использовании. Советуем ознакомиться всем начинающим разработчикам, но и для старичков найдутся интересные моменты.

What’s new with Testcontainers in Spring Boot 3.2.0. В Spring Boot 3.2.0 добавилось несколько новых удобных интеграций с Test Containers. Во-первых, ServiceConnection теперь может работать с контейнерами Oracle Database Free, OpenTelemetry Collector, Apache ActiveMQ Classic и Apache Pulsar. Во-вторых, добавили специальное свойство spring.testcontainers.beans.startup, которое позволяет указать, как запускать контейнеры: последовательно или параллельно. Так что если ваши тесты работают с несколькими контейнерами, независимыми друг от друга, можно получить хороший прирост скорости выполнения тестов.

Building Spring Boot’s ServiceConnection for Testcontainers WireMock. В туториале детально объясняется, как можно написать тесты с использованием тест-контейнера WireMock для эмуляции внешнего сервиса вроде GitHub. Также вы узнаете, как написать кастомный ServiceConnection для упрощенной конфигурации работы с контейнером. 

Builders, Withers, and Records: Java’s path to immutability. Заметка о том, как и зачем объявлять и работать с неизменяемыми объектами в Java. Рассмотрены как Builder и Wither, так и record, появившиеся с 16-й версии Java. От себя же хочется дополнить, что никогда не стоит забывать о том, что состояние объекта можно изменить с помощью не только сеттера, но и геттера, если тот возвращает, например, изменяемую коллекцию. За этим также нужно следить.

The „Spring Way“ of Doing Things: 9 Ways to Improve Your Spring Boot Skills. В статье много хороших практик и полезных советов для эффективной работы со Spring Boot. Затрагиваются конфигурация, мониторинг, тестирование, обработка исключений и так далее. Если вы начинаете осваивать Spring Boot, найдете для себя много интересного.

Внутренний мир: Java NIO. Материал-конспект об основных концепциях и устройстве java.nio, используемом для обеспечения неблокирующего ввода или вывода и появившимся еще в далекой Java 1.4 

Spring Framework — Internals of RestClient. Небольшая статья о RestClient в Spring Boot 3.2. Объясняются его преимущества над RestTemplate и WebClient, рассматривается его конфигурация.

When Database Integration Beats Microservices. Автор предлагает несколько вариантов архитектуры, подробно рассматривая микросервисную архитектуру и подход интеграции через БД. Попутно разбирает причины, почему интеграция через БД — антипаттерн, и предлагает решение проблем такого подхода. 

Просто интересное

20 лет с момент выхода Spring 1.0.
24 марта 2004 года вышла версия 1.0 всеми любимого Spring — вспоминаем его функционал на spring.io. 

Analyzing JVM Energy Consumption for JDK 21: An Empirical Study. Большая статья про энергопотребление различных JVM с 21-й версии Java. В статье рассматривается, какие JVM наиболее производительные и энергоэфективные. Если коротко: спасите природу — используйте Oracle GraalVM Native Image.

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

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

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


  1. kozlov_de
    08.04.2024 15:15

    Можно в 2х словах для не джависта

    Куда джава развивается последние лет 5, например?


    1. Hixon10
      08.04.2024 15:15
      +6

      Несколько параллельных инициатив за последние года:

      1. проект Лум - виртуальные потоки. Способ делать асинхронное программирование на джаве, без сложного реактивного программирования.

      2. Паттерн матчинг - инструмент для реализации Data-oriented программирования (описываем нашу предметную область, как records, и sealed classes/interfaces, а потом пишем логику, используя exhaustive switch).

      3. Улучшение производительности за счет ряда проектов (Vector API, GC improvements).

      4. Улучшение взаимодействия с нативным кодом (Project Panama) - как вызывать Си функцию (или любую другую с C ABI) без боли и приседаний.

      5. Упрощения языка для начинающих программистов - как сделать так, чтобы первая программа на джаве не требовала IDE, build tool, и прочтения книжки, а можно было просто взять и написать main() функцию и какой-то код.


    1. Gmugra
      08.04.2024 15:15
      +2

      Java развивается примерно туда же куда и другие популярные ЯП: реагирует на меняющуюся реальностью предоставляя новые востребованные возможности, и постепенно "починяя" старые косяки.

      Сильно изменился собственно процесс разработки (уже лет 10 как?), в результате мы имеем частые релизы с меньшим количеством новых фич, но фичи эти переживают несколько итераций до релиза и, в итоге, выглядят гораздо более вылизанными, продуманными и последовательными.

      Подъезжает все больше и больше поддержки современных подходов к разработке (функциональщина и pattern matching, Data-oriented - вот это вот всё)

      Всё еще трепетное отношение к обратной совместимости: что то удаляется из языка крайне редко и с предупреждением за много лет. Это, надо заметить, важная для бизнеса и сложная для разработчиков самого языка особенность.

      Постепено платятся старые долги. Это история про какие-то вещи которые "странно что этого не было ещё 20 лет назад". Т.е. мы не только про "давай давай новый API и поддержку модных парадигм", но и про то что "давно пора бы вот это до ума довести". Text Blocks или, скажем, SequencedCollection как примеры.

      Большие усилия в сторону производительности. Это мало заметно простым разработчикам, однако много чего происходит в "кишках": сборщики мусора (которых уже сколько? шесть?), всякие низкоуровневые и платформозависимые оптимизации и т.п.

      В целом Java выглядит очень активно развивающимся и актуальным ЯП. Прям чем дальше тем больше хорошеет, как по мне.

      При этом надо помнить, что мы говорим о ЯП с 30-летней историей и необъятной экосистемой. Скажем мягко "в некоторой степени спорные вещи" останутся с нами до конца времен: По видимому в Java никогда не будет "Null safety" как в Kotlin; Java никогда не станет столь прост в освоении к Python; Короче, много к чему вопросики есть. Но вокруг какого ЯП таких вопросиков нет?