Java 9: новые возможности и инструменты для разработчиков
Java 9 - долгожданный релиз популярной платформы программирования Java. Это издание включает множество новых возможностей и инструментов, которые сделают разработку на Java еще более удобной и эффективной.
Модульная система Java
Одним из ключевых нововведений Java 9 является внедрение модульной системы. Это часть большого проекта Jigsaw, цель которого - разбить монолитную структуру Java на отдельные модули.
Модуль в Java 9 - это цовокупноцть пакетов и ресурсов, имеющих уникальное имя (identifier). Каждый модуль капсулирует свой код и данные, экспортируя только выбранные пакеты.
Модульная система решает проблемы монолитности Java, позволяя компоновать приложения из небольших частей.
Рассмотрим пример определения простого модуля:
module my.module { exports my.package; }
Здесь мы экспортируем пакет my.package
, сделав его доступным извне. Остальные пакеты инкапсулированы внутри модуля.
Ключевые преимущества:
- Инкапсуляция внутренних API
- Лучшее структурирование кода
- Ускорение загрузки приложений
Помимо собственных модулей, разработчик получает доступ к 92 модулям JDK 9. Обновленная модульная структура JDK является еще одним важным нововведением этого релиза.
Помимо архитектурных изменений, в Java 9 появилось немало удобных возможностей на уровне языка.
JShell
JShell - это интерактивная JavaScript-подобная среда (REPL) для тестирования кода Java прямо в консоли.
jshell> int x = 15; x ==> 15 jshell> String message = "Hello"; message ==> "Hello" jshell> System.out.println(message); Hello
JShell позволяет быстро протестировать работу отдельных конструкций, не создавая полноценных классов и методов.
Неизменяемые коллекции
Теперь список, множество и словарь можно легко сделать неизменяемыми вызовом статических методов List.of()
, Set.of()
, Map.of()
:
List<String> list = List.of("foo", "bar"); Set<Integer> set = Set.of(1, 2, 3); Map<String, Integer> map = Map.of("a", 1, "b", 2);
Это избавляет от необходимости использовать громоздкий Collections.unmodifiableXXX()
.
Кроме того, в интерфейсах теперь можно объявлять private методы, появился diamond оператор для анонимных классов и многое другое.
Реактивное программирование
Еще одним важным нововведением в Java 9 стала поддержка реактивного подхода к разработке приложений. Реактивное программирование подразумевает создание отзывчивых, масштабируемых систем, которые эффективно работают в условиях высокой нагрузки.
Для реализации реактивных приложений на Java введен новый API - Reactive Streams. В его состав входят несколько ключевых интерфейсов:
- Flow.Publisher
- Flow.Subscriber
- Flow.Processor
Рассмотрим их использование на примере:
// Публикатор создает поток чисел Flow.Publisher<Integer> publisher = new MyNumberPublisher(); // Подписчик получает числа и обрабатывает их Flow.Subscriber<Integer> subscriber = new MyNumberSubscriber(); // Организуем поток данных от издателя к подписчику publisher.subscribe(subscriber);
Publisher и Subscriber взаимодействуют асинхронно через неблокирующие вызовы. Это позволяет добиться высокой производительности и масштабируемости.
Улучшения API CompletableFuture
Дополнительные улучшения коснулись и библиотеки CompletableFuture, используемой для асинхронного программирования.
Теперь есть возможность задать таймауты и задержки для асинхронных операций. Например:
// Задержка на 1 секунду перед выполнением CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello") .thenApply(s -> s + " World!") .delay(1, TimeUnit.SECONDS); // Таймаут операции в 500 мс future.orTimeout(500, TimeUnit.MILLISECONDS);
Это существенно расширяет возможности библиотеки.
Создание параллельных приложений
Благодаря Flow API и усовершенствованиям CompletableFuture, Java 9 предоставляет отличные средства для создания высокопроизводительных параллельных систем.
Асинхронные потоки данных и задачи можно легко масштабировать на многоядерных системах, эффективно загружая все доступные вычислительные мощности.
Java 9 открывает новую эру в разработке отзывчивых enterprise-приложений.
Улучшения в Stream API
Популярный Stream API также получил ряд улучшений в Java 9:
- Метод
takeWhile
для обрыва потока по условию - Метод
dropWhile
для пропуска элементов по условию - Перегруженные версии
ofNullable
Например, takeWhile позволяет легко реализовать выборку элементов потока до первого совпадения:
Stream.of(1, 2, 3, 4) .takeWhile(n -> n < 3) .forEach(System.out::println);
В результате будут напечатаны числа 1 и 2.
Поддержка HTTP/2
В Java 9 реализован новый HTTP-клиент, поддерживающий современный протокол HTTP/2. Основные преимущества HTTP/2:
- Более быстрая загрузка страниц
- Мультиплексирование запросов
- Сжатие заголовков
- Пуш-уведомления от сервера
Использование HTTP/2 клиента в Java 9:
var client = HttpClient.newHttpClient(); var request = HttpRequest.newBuilder() .uri(URI.create("https://example.com/")) .build(); HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
API отзывчивых изображений
Еще одно полезное нововведение - API для работы с отзывчивыми изображениями. Оно позволяет загружать и отображать изображения в соответствии с разрешением и размерами устройства.
Это упрощает создание кросс-платформенных приложений и адаптивных веб-сайтов под мобильные устройства.