Краткий обзор новых функций версии Java, которая скоро будет доступна

17 марта выпущена Java 14, в которой были внесены некоторые важные улучшения. После шестимесячной периодичности выпуска Java 14 в августе будет заменена Java 15. Java 15 также будет выпуском функций Java, точно так же, как Java 14, а не выпуском с долгосрочной поддержкой (LTS). Текущий выпуск LTS - это Java 11, и, надеюсь, он будет заменен выпуском Java 17 LTS в 2021 году.

По состоянию на 16 июля Java 15 находится во второй фазе прекращения эксплуатации. Это означает, что общий набор функций заморожен, и в этом выпуске не будут нацелены на дальнейшие JEP. Итак, ниже приведены ожидаемые функции, которые будут представлены в Java 15 согласно веб-сайту OpenJDK.

Я собираюсь обсудить некоторые из этих важных функций ниже.

JEP 339: Алгоритм цифровой подписи по кривой Эдвардса (EdDSA)

EdDSA - это система цифровой подписи, которая представляет собой вариант системы подписи Шнорра с кривыми Эдвардса. Вы можете прочитать больше об этом здесь". Java 15 предоставляет эту схему подписи, которая имеет преимущества по сравнению с существующими в настоящее время схемами подписи в JDK.

Предложение по усовершенствованию Java (JEP) в основном направлено на реализацию этой схемы, стандартизированной в RFC 8032, и на разработку платформенно-независимой реализации EdDSA с лучшей производительностью по сравнению с существующими реализациями ECDSA, а также на обеспечение того, чтобы время не зависело от используемого секрета.

Ниже приводится пример использования API из JEP.

// example: generate a key pair and sign
KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");
KeyPair kp = kpg.generateKeyPair();
// algorithm is pure Ed25519
Signature sig = Signature.getInstance("Ed25519");
sig.initSign(kp.getPrivate());
sig.update(msg);
byte[] s = sig.sign();

// example: use KeyFactory to contruct a public key
KeyFactory kf = KeyFactory.getInstance("EdDSA");
boolean xOdd = ...
BigInteger y = ...
NamedParameterSpec paramSpec = new NamedParameterSpec("Ed25519");
EdECPublicKeySpec pubSpec = new EdECPublicKeySpec(paramSpec, new EdPoint(xOdd, y));
PublicKey pubKey = kf.generatePublic(pubSpec);

JEP 360: Запечатанные классы (предварительная версия)

Это будет только предварительная версия в Java 15. Здесь мы можем запечатать класс / интерфейс, применив к объявлению модификатор sealed. Таким образом, мы можем ограничить, какие другие классы или интерфейсы могут их расширять или реализовывать. Благодаря этому мы сможем предоставить более декларативный способ, чем модификаторы доступа, для ограничения использования суперкласса.

В предыдущих версиях Java предоставляла очень ограниченное количество инструментов в этой области. Разработчик должен был либо сделать класс окончательным, чтобы у него не было подкласса, либо сделать класс или его конструктор закрытым для пакета, чтобы он мог иметь подклассы только в одном пакете. У этих обходных путей есть свои недостатки. Но с этой новой функцией очень легко реализовать ограничения классов.

public sealed class Shape
    permits Circle, Rectangle, Square {...}

JEP 371: Скрытые классы

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

Основные цели этого JEP включают в себя предоставление фреймворкам возможности определять классы как не обнаруживаемые детали реализации фреймворка, чтобы они не могли быть связаны с другими классами или обнаруживаться посредством отражения, поддержка агрессивной выгрузки не обнаруживаемых классов и отказ от необнаруживаемых классов. -стандартный API, misc.Unsafe :: defineAnonymousClass.

JEP 373: переопределить устаревший API-интерфейс DatagramSocket

Кодовая база API java.net.DatagramSocket и java.net.MulticastSocket очень старая и хрупкая. Эти API восходят к JDK 1.0 и представляют собой смесь как устаревшего кода Java, так и кода C, который сейчас трудно поддерживать. А также MulticastSocket был реализован во время разработки IPv6. Следовательно, он не имеет большой поддержки IPv6. Кроме того, у них есть некоторые проблемы с параллелизмом, и по этим причинам эти реализации будут заменены более простыми и гораздо более современными реализациями, которые легко поддерживать и отлаживать.

JEP 378: Текстовые блоки

Текстовый блок - это многострочный строковый литерал, в котором нет необходимости использовать escape-последовательности. Было много экспериментов с многострочными строками из Java 12, которые продолжились в Java 13 и 14. Теперь это становится постоянной функцией в Java 15. Благодаря этому выражение строк, которые занимают несколько строк, очень легко использовать, а удобочитаемость. из них также улучшены. Теперь программисты могут легко встроить фрагмент HTML, XML, SQL или JSON в строковый литерал, который раньше требовал значительного редактирования с конкатенациями и escape-последовательностями.

Текстовый блок может быть создан из трех символов и закрываться теми же тремя символами. Ниже приводится пример, взятый с веб-сайта OpenJDK.

String query = """
               SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB"
               WHERE "CITY" = 'INDIANAPOLIS'
               ORDER BY "EMP_ID", "LAST_NAME";
               """;

JEP 374: Отключить и исключить предвзятую блокировку

Смещенная блокировка - это метод оптимизации, используемый в виртуальной машине HotSpot для уменьшения накладных расходов, связанных с неконтролируемой блокировкой. Но преимущества предвзятой блокировки становятся менее важными с современными продвинутыми компьютерами, и поэтому она отключается в Java 15.

Но поскольку некоторые приложения Java могут показывать снижение производительности при отключенной смещенной блокировке, программисты могут снова включить это, установив XX: + UseBiasedLocking в командной строке.

JEP 377 и JEP 379: Сборщики мусора

ZGC, масштабируемый сборщик мусора с малой задержкой, был экспериментальной функцией, начиная с Java 11, и стал функцией продукта в Java 15. Shenandoah GC также был экспериментальной функцией, начиная с Java 12, которая будет функцией продукта в Java 15.

JEP 375: сопоставление с образцом для instanceof (второй просмотр)

Первая предварительная версия этой функции была представлена ​​в Java 14. Это обеспечивает простой и эффективный способ проверки экземпляров.

if (obj instanceof String s) {
    // can use s here
} else {
    // can't use s here
}

Вы можете узнать больше о сопоставлении с образцом здесь.

JEP 384: Записи (второй просмотр)

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

JEP 383: API доступа к внешней памяти (второй инкубатор)

Этот API уже поставляется в виде инкубационного модуля в Java 14. Инкубационные функции - это экспериментальные API, распространяемые в виде отдельных модулей с именами, начинающимися с «jdk.incubator.».

Этот API позволяет программам Java безопасно и эффективно обращаться к памяти за пределами кучи Java, уделяя особое внимание обеспечению, универсальности, безопасности, детерминированности и удобству использования.

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

Я подошел к концу своей статьи и надеюсь, что вы что-то поняли из этого прочтения. Спасибо за чтение. Ваше здоровье.

Ресурсы