Java 9 — все, что вам нужно знать об особенностях новой Java
Опубликовано: 2018-04-24Java, язык программирования с высокой доступностью, стал легкой задачей для разработчиков по всему миру. С момента своего появления в 1995 году язык широко используется в различных отраслях.
Сегодня вы найдете Java на своих телефонах. Операционная система Android и множество приложений, которые предлагает Android. Он используется для разработки таких игр, как Minecraft с огромной базой игроков. Он также находит применение в бизнес-приложениях, таких как чтение информации о кредитных картах на кассах магазинов и передача информации между системами и банками.
После перерыва в 3 года Java выпустила новую версию — Java SE 9. С несколькими ключевыми архитектурными изменениями и дополнительными функциями Java SE 9 предлагает мощное решение, о котором так мечтали разработчики.
В 2011 году в Java 7 была добавлена попытка использования ресурсов, что позволило улучшить функциональность управления ресурсами.
В Java 8 добавлены лямбда-выражения, хороший ход, но с некоторыми недостатками в парадигме ООП.
Теперь Java Solutions позволяет программистам иметь приватные методы. Приватные статические методы! ДА, вы правильно прочитали!
Java SE 8 предлагала множество структурных изменений, которые были восприняты разработчиками со смешанными эмоциями. В основном это недостатки Java SE 8, которые Java SE 9 попыталась преодолеть:
- JDK не был доступен для небольшого вычислительного устройства.
- Не было общего улучшения производительности приложений
- Отсутствовала общая безопасность и обслуживание JDK.
- Разработчики Java столкнулись с трудностями при создании и поддержке библиотек кода и более крупных приложений.
Итак, давайте посмотрим на ключевые изменения и улучшения, которые предлагает Java 9 по сравнению со своими предшественниками.
Обработка обновлений API в Java 9
Традиционно API Java был примитивным по своей природе. Эта поддержка для запуска новых процессов, перенаправления вывода и потоков ошибок. В Java 9 новые обновления Process API позволяют:
- Получение PID текущего и любого другого процесса JVM
- Управление подпроцессами
- Управление подпроцессами
- Получите такую информацию, как PID, имя и использование ресурсов процессов, запущенных в системе.
Это пример кода, который выводит текущий PID, а также текущую информацию о процессе:
public class NewFeatures
{
public static void main(String [] args)
{
ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("PID:"+ currentProcess.getPid());
ProcessHandle.Info currentProcessInfo = currentProcess.info();
System.out.println("Info:" + currentProcessInfo);
}
}
Клиент HTTP/2 в Java 9
Ожидается, что эта функция будет реформирована в последующих выпусках или даже может быть полностью удалена.
Раньше разработчики полагались на сторонние библиотеки, например Apache HTTP, Jersey и многие другие. HTTP API Java предшествует спецификации HTTP/1.1, является синхронным и сложным в обслуживании. Эти ограничения вызвали необходимость добавления нового API. Новый клиентский API HTTP предоставляет следующие возможности:
- Простой и лаконичный API для обработки большинства HTTP-запросов.
- Поддержка спецификации HTTP/2
- Лучшая производительность
- Лучшая безопасность
- Еще несколько улучшений
Вот фрагмент кода для выполнения HTTP-запроса GET с использованием новых API. Это модуль, определенный в файле module-info.java:
module newfeatures{
requires jdk.incubator.httpclient;
}
Следующий код использует HTTP Client API. Это часть модуля jdk.incubator.httpclient :
import jdk.incubator.http.*;
import java.net.URI;
public class Http2Feature{
public static void main(String[] args) throws Exception{
HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest
.newBuilder(new URI(http://httpbin.org/get;))
.GET()
.version(HttpClient.Version.HTTP_1_1)
.build();
HttpResponse.String response = client.send(request,
HttpResponse.BodyHandler.asString());
System.out.println("Status code:" + response.statusCode());
System.out.println("Response Body:" + response.body());
}
}
}
Дополнительные функции параллельных обновлений в Java 9
В Java 9 появился новый класс java.util.concurrent.Flow, который поддерживает реализацию платформы публикации-подписки. Эта структура позволяет разработчикам создавать компоненты. Эти компоненты могут асинхронно потреблять поток данных в режиме реального времени, настраивая издателей, которые производят данные, и подписчиков, которые потребляют данные. Это новые интерфейсы:

- java.util.concurrent.Flow.Publisher
- java.util.concurrent.Flow.Subscriber
- java.util.concurrent.Flow.Subscription
- java.util.concurrent.Flow.Processor (который действует как издатель и подписчик).
Сценарий оболочки Java (цикл чтения-оценки-печати) в Java 9
Цель проекта Kulla состояла в том, чтобы исследовать добавление инструмента REPL (Read-Eval-Print-Loop) для Java 9. В этом выпуске Java есть специальный инструмент командной строки под названием JShell. Целью здесь является популяризация и максимальное использование REPL. Так что это значит? Теперь вам не нужно оборачивать несколько строк кода в отдельный метод для их запуска. Эффективный? Я говорю да.
Например, в Scala простая программа Hello World записывается как scala>println("Hello World");
Давайте запустим команду JShell, как показано на следующем изображении:
Проект Jigsaw на Java 9
Козырная карта новых функций в Java 9 — это полностью новая модульная система. Для создания сложных систем часто используются сложные коды высокого уровня, что приводит к неоднозначности. При сложности кода возникают две фундаментальные проблемы: затруднена инкапсуляция кода и отсутствует понятие явных зависимостей между различными JAR-файлами системы. Доступ к каждому открытому классу может получить любой другой открытый класс в пути к классам. Это приводит к ненужному использованию классов, которые не предназначены для общедоступного API. Кроме того, сам путь к классам проблематичен: как узнать, есть ли все необходимые JAR-файлы, и что делать с повторяющимися записями? Модульная система решает обе проблемы.
Именно здесь видна надежная природа Java 9. Модульные файлы JAR содержат дополнительный дескриптор модуля. В этом дескрипторе модуля операторы `requires` используются для выражения зависимостей от других модулей. Кроме того, операторы exports определяют, какие пакеты доступны для разных модулей. По умолчанию все неэкспортированные пакеты инкапсулируются в модуль.
Существуют различные JEP, которые являются частью этого проекта, а именно:
JEP 200 — модульный JDK: применяется модульная система платформы Java для модуляризации JDK, которые можно комбинировать во время компиляции, сборки или выполнения.
JEP 201 - модульный исходный код: используется для создания модулей и позволяет сборочным инструментам компилировать созданные модули.
JEP 220 — модульные образы среды выполнения: этот JEP повышает производительность, безопасность и удобство обслуживания за счет реструктуризации образов среды выполнения JDK и JRE для размещения модулей.
JEP 282 — jlink, известный как компоновщик Java: использование в качестве модулей упаковки и их зависимостей за меньшее время выполнения.
JAR-файлы с несколькими выпусками
Чтобы использовать новые функции платформы Java в более новых версиях, разработчики библиотек должны выпустить более новую версию своей библиотеки. Вскоре разработчики будут поддерживать несколько версий библиотеки, что может привести к катастрофическим последствиям. Чтобы обойти это ограничение, в Java 9 реализовано несколько выпусков файлов JAR, что позволяет разработчикам создавать файлы JAR с разными версиями файлов классов для разных версий Java. Взгляните на этот пример.
Иллюстрация текущих файлов JAR выглядит следующим образом:
корень банки
- Класс
– B.класс
– С.класс
Вот как выглядят многорелизные JAR-файлы:
корень банки
- Класс
– B.класс
– С.класс
– МЕТА-ИНФ
- версии
– – 9
- - - - Класс
– – 10
– – – – B.класс
На предыдущем рисунке файлы JAR поддерживали файлы классов для двух версий Java 9 и 10. Таким образом, когда JAR выполняется в версии Java 9, для выполнения выбираются папки A.class в версиях 9.
В более ранних версиях Java, которые не поддерживают файлы JAR с несколькими выпусками, классы в каталоге версий никогда не используются. Итак, если вы запускаете файл JAR с несколькими выпусками на Java 8, это так же хорошо, как запуск простого файла JAR.
На мой взгляд, с Java все начинает меняться. И это нарастающая тенденция. Означает ли это, что это повлияет на популярность Java и ее использования? Нисколько. Java был и остается сегодня невероятно мощным и надежным языком программирования в технологической отрасли. Начните изучать Java и наблюдайте, как это изменит вашу карьеру. Удачи!
Примечание автора:
Эта техническая статья написана компанией Sumit, которая занимается такими популярными технологиями, как DevOps, Big Data и Python. И в команде цифрового маркетинга в Edureka.