Рубрики
Без рубрики

Функции Java 15

Функции Java 15. Это релиз, не относящийся к LTS. Мы можем загрузить и установить Java 15 с веб-сайта OpenJDK. Основные функции Java 15 являются закрытым классом.

Автор оригинала: Pankaj Kumar.

В соответствии с традицией шестимесячного цикла, после выпуска Java 14 17 марта 2020 года у нас теперь есть Java 15, следующая версия, не относящаяся к LTS, выйдет 15 сентября 2020 года.

Функции Java 15

Вот краткий обзор функций, которые являются частью Java 15:

  • Закрытые классы (Предварительный просмотр) – JEP 360
  • Сопоставление шаблонов для instanceof (Второй предварительный просмотр) – JEP 375
  • Записи (Второй предварительный просмотр) – JEP 359
  • Текстовые блоки (стандартные) – JEP 378
  • Скрытые классы – JEP 371
  • Удалите движок JavaScript Nashorn – JEP 372
  • Переопределите устаревший API DatagramSocket – JEP 373
  • Отключите и отмените предвзятую блокировку – JEP 374
  • Шенандоа: Сборщик Мусора с низкой задержкой – JEP 379
  • Удалите порты Solaris и SPARC – JEP 381
  • API доступа к внешней памяти (Второй инкубатор)- JEP 383
  • Отмените активацию RMI для удаления – JEP 385

Установка Java 15 Настройка на Mac OS

  • Чтобы начать работу с Java 15, загрузите JDK из здесь .
  • Скопируйте и извлеките файл tar в /Библиотеке/Java/JavaVirtualMachines , как показано ниже:
$ cd /Library/Java/JavaVirtualMachines

$ sudo cp ~/Downloads/openjdk-15_osx-x64_bin.tar.gz /Library/Java/JavaVirtualMachines

$ sudo tar xzf openjdk-15_osx-x64_bin.tar.gz

$ sudo rm openjdk-15_osx-x64_bin.tar.gz

Как только это будет сделано, откройте файл bash_profile с помощью любого текстового редактора. Я использую vim ~/.bash_profile . Установите путь Java15 к JAVA_HOME, сохраните изменения и выполните source ~/.bash_profile , чтобы отразить изменения.

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-15.jdk/Contents/Home

Наконец, вы готовы к компиляции и запуску программ с использованием Java 15. Мы будем использовать Shell , интерактивный инструмент командной строки REPL для быстрого тестирования новых функций Java 15.

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

jshell --enable-preview

javac --release 15 --enable-preview Author.java

В следующих нескольких разделах давайте обсудим существенные изменения языка в Java 15.

1. Закрытые классы (Предварительный просмотр)

Запечатанные классы существуют в Kotlin уже некоторое время, и Java 15, наконец, вводит эту функцию для лучшего контроля над наследованием.

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

Это невероятно полезно для сопоставления шаблонов, так как у вас есть определенное количество классов для переключения между ними.

Следующий синтаксис определяет закрытый класс в Java 15:

public sealed class Vehicle permits Car, Bike, Truck {
...
}

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

В случае, если вы определили классы Автомобиль , Велосипед и Грузовик в том же файле , что и Транспортное средство , вы можете опустить ключевое слово разрешения, и компилятор неявно позаботится об этом, как показано ниже:

sealed class Vehicle {...}

final class Car extends Vehicle {...}
final class Bike extends Vehicle {...}
final class Truck extends Vehicle {...}

Как вы можете видеть выше, мы определили окончательный модификатор каждого из классов. Итак, это важное правило запечатанного класса, которое вам нужно иметь в виду: каждый разрешенный класс должен быть задан с явным модификатором. Он может быть окончательным или запечатанным или не запечатанным .

Вот как каждый из модификаторов влияет на наследование:

  • Разрешенный подкласс, объявленный окончательным , не может быть расширен дальше.
  • Разрешенный подкласс, объявленный запечатанным , может быть расширен дальше, но только классами, разрешенными подклассом.
  • Разрешенный подкласс может быть объявлен не запечатанным может быть расширен любым классом. Суперкласс не может ограничивать подклассы ниже по этой иерархии классов.

До Java 15 разработчики могли использовать только модификаторы конечного ключевого слова или области для управления наследованием. Таким образом, закрытые классы обеспечивают дополнительную гибкость для разработчиков Java при определении иерархий классов.

API отражения Java также получает два новых метода для работы с закрытыми классами:

java.lang.constant.ClassDesc[] getPermittedSubclasses();

boolean isSealed()

2. Записи (Второй предварительный просмотр)

Записи были представлены в качестве функции предварительного просмотра в Java 14 в попытке сократить стандартный код при написании классов носителей данных на основе POJO. Это то, что уже давно существует в Котлине в виде классов данных.

Теперь, с Java 15, записи получают свой второй предварительный просмотр. Хотя никаких серьезных изменений нет(только некоторые незначительные дополнения), все же есть несколько основных разъяснений и ограничений, которые вы должны знать:

  • До Java 15 можно было объявлять собственные методы в записях(хотя это была не очень хорошая идея). Теперь JEP явно запрещает объявлять собственные методы в записях. Понятно, что определение собственного метода крадет USP записей, создавая зависимость от внешнего состояния.
  • Неявно объявленные поля, соответствующие компонентам записи класса записей, являются окончательными и не должны быть изменены с помощью отражения сейчас, так как это вызовет Исключение IllegalAccessException .

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

Записи с запечатанными типами

Мы знаем, что записи являются окончательными и не могут быть продлены. С радостью, записи могут реализовывать интерфейсы.

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

sealed interface Car permits BMW, Audi { ... }

record BMW(int price) implements Car { ... }

record Audi(int price, String model) implements Car { ... }

Местные Записи

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

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

Смотрите, как введение локальных записей помогает выполнять вычисление значений в потоковом API с помощью следующего метода:

List findTopMerchants(List merchants, int month) {
    // Local record
    record MerchantSales(Merchant merchant, double sales) {}

    return merchants.stream()
        .map(merchant -> new MerchantSales(merchant, computeSales(merchant, month)))
        .sorted((m1, m2) -> Double.compare(m2.sales(), m1.sales()))
        .map(MerchantSales::merchant)
        .collect(toList());
}

Вывод

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

Скрытые классы-это функция JVM, которая актуальна для разработчиков фреймворков. Это позволяет сделать реализации классов недоступными для обнаружения, определив их с помощью Lookup::определить скрытый класс . При этом такие классы нельзя найти ни с помощью Class.forName , ни путем ссылки на них в байт-коде.

Это основные изменения, внесенные в Java 15.