Статьи

Чего ожидать в Java 11

Последние несколько лет были неспокойными для мира Java, с разнообразным набором функций, добавленных в несколько выпусков.

В сообществе разработчиков возникло чувство, что Java развивается недостаточно быстро. В течение первых 20 лет платформа Java и Java Development Kit (JDK) развивались большими, нерегулярными и несколько непредсказуемыми шагами. Каждый релиз был основан на одной или нескольких важных функциях. Таким образом, график каждого выпуска откладывался несколько раз, чтобы обеспечить выполнение этих функций.

Этот подход хорошо сработал, чтобы обеспечить большие новые функции с высоким уровнем качества. Однако меньшие возможности и интерфейс прикладного программирования (API) могут быть предоставлены только тогда, когда большие функции будут готовы. Это было приемлемо несколько лет назад, но не больше. В настоящее время разработчики могут выбирать из множества платформ , которые развиваются более быстрыми темпами.

Ява 11

Последним выпуском под руководством Sun Microsystems была Java 1.6 (также известная как Java 6), и она оставалась последним крупным выпуском Java в течение пяти лет. Вскоре Sun попала в беду и в итоге была приобретена Oracle.

Java 7 был первым основным выпуском под руководством Oracle, за которым последовала Java 8. Эволюционные изменения для платформы Java начались с Java 9. Точно так же, как Java 8 была посвящена лямбдам и их последствиям (функциональное программирование, потоки и методы по умолчанию). Java 9 была в основном о модулях.

Прежде чем увидеть, какие новые, захватывающие функции появятся в Java 11, давайте сначала посмотрим на постепенное внедрение новых функций начиная с Java 9.

Особенности, представленные в Java 9

После нескольких задержек с расписанием Java 9 была выпущена 21 сентября 2017 года. Большинство разработчиков считают, что Java 9 в основном касается модульности.

Релиз Java 9 и его функции стали важной вехой в экосистеме Java. Модули были новым способом создания и развертывания программного обеспечения. Они помогли разработчикам создать лучшее программное обеспечение с гораздо меньшими размерами. Ключевыми функциями были Project Jigsaw, JShell и ряд других улучшений.

Project Jigsaw был самым большим дополнением в JDK 9, которое принесло модульность платформе Java. Большая кодовая база часто приводит к сложному, запутанному «спагетти-коду». Весьма сложно инкапсулировать код без четких зависимостей между различными частями системы (архив Java или файлы JAR) системы.

Проект Jigsaw представил модульность, подобную OSGi , где дополнительный дескриптор модуля может использоваться для выражения зависимостей между модулями. Проект Jigsaw стал сменой парадигмы в наших представлениях и разработке крупномасштабных приложений.

Двадцать лет разработки на платформе Java сделали свое дело. Многие классы запутались, и не было простого способа инкапсулировать частные классы реализации в JDK. Это способствовало распространению внешних библиотек в зависимости от внутренних деталей, в то же время препятствуя развитию платформы.

В Project Jigsaw теперь Java 9 включает в себя около 90 различных модулей, которые группируют связанные пакеты. Только пакеты, которые были явно экспортированы из модуля, могут быть доступны из других модулей. Это делает инкапсуляцию внутренних классов реализации реальностью.

Ява 11

Кроме того, модули могут указывать зависимости от других модулей. Так же, как JDK был модульным, приложения также могут использовать те же методы. Вместо того, чтобы использовать хрупкий путь к классам (с дублирующимися, отсутствующими или несовместимыми JAR-файлами), вы можете создать свой собственный модуль, который инкапсулирует пакеты и определяет зависимости. Это будет иметь большое значение для создания более структурированных и более надежных приложений.

Java 9 также представила JShell, интерактивный Java REPL , который является сокращением от Java Shell и также известен как REPL (цикл чтения-оценки-печати) . Он добавляет возможность выполнения различных конструкций Java, таких как класс, интерфейс, перечисление, объект и операторы. JShell имеет широкий спектр применения, и наиболее распространенным является быстрое тестирование некоторого кода, чтобы увидеть, как он работает. Нет необходимости сначала создавать класс, компилировать его и запускать. Просто используйте JShell для быстрых тестов.

Были представлены различные улучшения функций, такие как модернизированная сетевая связь и поддержка WebSockets с поддержкой HTTP / 2.0, Enhanced Process API для упрощения контроля и управления процессами операционной системы и улучшения Stream API для создания декларативных конвейеров преобразований в коллекциях.

Особенности, представленные в Java 10

Java 10 была выпущена 20 марта 2018 года. Поскольку у нее был короткий цикл выпуска, было представлено лишь несколько функций. Поскольку предполагается, что это будет краткосрочный выпуск, публичные обновления для JDK 10 должны закончиться через шесть месяцев. Многие разработчики могут не переходить на Java 10, так как они предпочитают ждать Java 11.

Вывод типа был требованием от разработчиков в течение длительного времени, так как многие статически типизированные языки уже поддерживают эту функцию.

В JEP 286 было введено определение типа локальной переменной (JDK Enhancement Proposal), новое ключевое слово var, которое сокращает объявление локальной переменной. Это указывает компилятору выводить тип локальной переменной из ее инициализатора.

До Java 10 мы использовали для объявления переменных следующим образом:

1
2
3
4
URL simpleProgrammer = new URL(http://www.simpleprogrammer.com);
URLConnection connection = simpleProgrammer.openConnection();
Reader reader = new BufferedReader(
New InputStreamReader(connection.getInputStream()));

В Java 10 мы можем избежать явного объявления типов и писать код следующим образом:

1
2
3
4
var simpleProgrammer = new URL(http://www.simpleprogrammer.com);
var connection = simpleProgrammer.openConnection();
var reader = new BufferedReader(
New InputStreamReader(connection.getInputStream()));

Ключевое слово var сделало Java менее многословным, удалив избыточность из объявления переменной. Можно было бы неявно определить тип переменной из контекста, в котором она используется.

В зависимости от версии выпуска версии формат номера версии Java был изменен, чтобы улучшить поддержку модели выпуска на основе времени. Наиболее примечательным аспектом новой модели выпуска является то, что содержание выпуска может быть изменено.

В начале объявлена ​​только дата релиза. Однако, если разработка этой новой функции займет больше времени, чем ожидалось, она удаляется из ритма выпуска и не будет включена. Следовательно, существует необходимость в номере версии, который отображает ход времени, а не характер включенных изменений.

Параллельный полный GC в G1 — интересная функция, которая может затеряться в шуме анонсов функций большого взрыва. На самом деле, многие разработчики могут даже не заметить этого.

G1 GC был представлен в Java 8 и стал сборщиком мусора по умолчанию в Java 9. По своей конструкции он избегает полных сборок мусора, но они все же случаются.

G1 использует только однопоточный алгоритм mark-sweep-compact для выполнения полного сбора, что может привести к проблемам с производительностью.

Java 10 исправила эту проблему, выполнив полный сборщик мусора, используя несколько потоков. Для полной коллекции используется то же количество потоков, что и для молодой и смешанной коллекций. Там будет заметно улучшение в полной производительности GC коллектора G1 сейчас.

Долгосрочный цикл выпуска и поддержки

Java 10 только что была выпущена, но сейчас мы с нетерпением ожидаем выхода Java 11 в конце этого года. Oracle стремится к более быстрому циклу выпуска, поэтому на нашем пути появляется больше возможностей и возможностей. Java 11 будет долгосрочным выпуском поддержки, в отличие от JDK 10, и будет эталонной реализацией платформы Java Standard Edition (Java SE) 11.

Ява 11

Наряду с новым выпуском, Oracle также изменила модель поддержки. В новой схеме есть разница между краткосрочными и долгосрочными выпусками. Выпуски, такие как Java 9 и 10, которые являются кратковременными, будут получать публичные обновления до тех пор, пока не станет доступен следующий выпуск функции. Это означает, что поддержка Java 9 закончилась в марте 2018 года, а поддержка Java 10 закончится после сентября 2018 года.

Java 11 имеет уникальную особенность, являясь первым долгосрочным выпуском, и будет поддерживаться в течение более длительного периода. Java 11 будет получать поддержку высшего уровня от Oracle до сентября 2023 года и расширенную поддержку до 2026 года.

Что нового в Java 11?

Java 11 потенциально выйдет с несколькими ключевыми функциями. Java 11 также может потерять некоторые возможности из-за удаления CORBA (люди все еще его используют?), Модулей Java EE (недавно переименованный в Jakarta EE) и JavaFX .

CORBA был популярным способом создания распределенных приложений более двух десятилетий назад, но я думаю, что сейчас он используется только в старых приложениях. Java EE и JavaFX больше не вписываются в стек JDK, и сейчас есть другие сторонние библиотеки, предоставляющие эти возможности. Давайте рассмотрим эти аспекты подробнее.

Новые функции, запланированные для Java 11

На данный момент Java 11 настроен на внедрение следующих функций:

  • JEP 318: Epsilon: произвольный сборщик мусора с низким объемом служебных данных — Epsilon объявлен сборщиком «no-ops», который обещает обрабатывать выделение памяти без применения каких-либо реальных механизмов восстановления памяти. Как указано в предложении , цель состоит в том, чтобы «обеспечить полностью пассивную реализацию GC с ограниченным пределом выделения и минимально возможными издержками задержки за счет использования памяти и пропускной способности памяти». Конкретные сценарии использования Epsilon включают тестирование производительности, тестирование давления памяти и тестирование интерфейса виртуальной машины (VM). Это также было бы полезно для чрезвычайно недолговечных заданий, улучшений времени ожидания последней капли или улучшений пропускной способности последней капли.
  • JEP 323. Синтаксис локальной переменной для лямбда-параметров. Вывод типа локальной переменной был введен в Java 10 как мера уменьшения многословности, связанной с написанием кода Java. Java 11 делает шаг вперед, позволяя использовать var для объявления формальных параметров неявно типизированных лямбда-выражений.

В настоящее время вам необходимо указать параметры для лямбда-выражения следующим образом:

1
(var a, var b) -> a.process(b)

Начиная с Java 11, вы можете упростить его, написав его следующим образом:

1
(a, b) -> a.process(b)

Хотя это приводит к единообразию синтаксиса, оно также позволяет применять модификаторы к локальным переменным и лямбда-форматам без краткости. Нет необходимости в избыточных синтаксических конструкциях, так как они могут быть выведены из контекста.

  • JEP 309. Динамические константы файла класса. Формат файла класса Java будет расширен для поддержки новой формы пула констант, CONSTANT_Dynamic. Это сократит затраты и затруднит создание новых форм материализуемых констант файла класса. В настоящее время, связывание вызываемой динамической ссылки делегатов с методом начальной загрузки. Это инструкция JVM, которая позволяет компилятору генерировать код, который вызывает методы с более свободной спецификацией, чем это было возможно ранее. Он предоставляет возможность совершать динамические вызовы, которые JVM не только распознает, но и оптимизирует так же, как оптимизирует обычные старые вызовы статического типа. Теперь загрузка CONSTANT_Dynamic делегирует создание методу начальной загрузки. Новая форма с постоянным пулом предложит разработчикам языков и разработчикам компиляторов более широкие возможности для выразительности и производительности.

Более быстрый выпуск JDK и более короткие циклы поддержки

Поскольку Oracle стремится к более быстрому циклу выпуска, на нашем пути появляются новые функции и возможности с высокой скоростью. В прошлом году Oracle объявила, что в 2018 году будет выпущено два выпуска JDK, а выпуск JDK 10 уже выпущен. Это долгожданное изменение из эпохи медленных циклов выпуска с большим количеством функций, внедряемых в основной выпуск каждые несколько лет.

Теперь мы можем ожидать меньшего выпуска функции каждые шесть месяцев. Это имеет много преимуществ, включая более быстрые инновации платформы Java. Риск обновления вашей версии Java уменьшается. Меньший набор функций облегчает внедрение для разработчиков.

Более быстрые циклы выпуска сделали Java гибким и проворным языком. Это стало динамичным языком, который отвечает рыночным силам и проблемам сообщества разработчиков.

Что не сделает разрез в Java 11?

Ява 11

Хотя Java 11, скорее всего, будет иметь некоторые новые функции, она все же будет более компактной, чем Java 10, в первую очередь потому, что некоторые устаревшие функции будут удалены.

JEP 320: удаление модулей Java EE и CORBA направлено на удаление модулей Java EE и CORBA с платформы Java SE и JDK. Фактически, эти модули уже устарели в Java 9 с объявленным намерением удалить их в будущем выпуске.

С выпуском Java SE 6 в декабре 2006 года был включен полный стек Web-сервисов. Это состояло из четырех технологий:

  • JAX-WS — API Java для веб-служб XML
  • JAXB — архитектура Java для привязки XML
  • JAF — среда активации JavaBeans
  • Общие аннотации для Java

С тех пор версии Java EE эволюционировали, что затрудняет для Java SE включение нерелевантных технологий и громоздкое обслуживание в двух выпусках Java. Существуют сторонние сайты, предоставляющие автономные версии технологий Java EE, поэтому Oracle больше не считает необходимым включать их в Java SE или JDK.

Что касается удаления CORBA, эта технология относится к 1990-м годам, и вряд ли кто-нибудь разрабатывает приложения, использующие ее в наши дни. Поскольку стоимость обслуживания CORBA значительно превышает преимущества, Oracle считает, что нет смысла включать ее в Java SE или JDK.

Будьте готовы к Java 11

Как разработчик Java, теперь у вас есть возможность обновлять версию Java каждые шесть месяцев, или вы можете предпочесть долгосрочный выпуск каждые несколько лет.

Oracle также рекомендует всем перейти на продукт Java SE Advanced. Он будет предлагать как минимум пять лет поддержки для каждого долгосрочного релиза. По моему мнению, если вы все еще пользуетесь более ранней версией, такой как Java 8 или Java 9, вы можете подождать немного дольше и перейти непосредственно к Java 11.

Java 11 поможет разработчикам создавать более качественное программное обеспечение с его замечательными новыми функциями, такими как сборщик мусора с минимальными издержками, с использованием лямбда-выражений с меньшей детализацией и более широкими возможностями для разработчиков языков и разработчиков компиляторов. Будущее выглядит захватывающим для мира Java.

Смотрите оригинальную статью здесь: что ожидать в Java 11

Мнения, высказанные участниками Java Code Geeks, являются их собственными.