След шест месеца разработка, компания Oracle пусна платформата Java SE 20 (Java Platform, Standard Edition 20), като еталонната реализация е в отворения проект OpenJDK. С изключение на премахването на някои остарели функции, Java SE 20 запазва обратната съвместимост с предишните версии на платформата Java - повечето от предишно написаните Java проекти ще работят без изменения под новата версия. Подготвени са инсталационни пакети на Java SE 20 (JDK, JRE и Server JRE) за Linux (x86_64, AArch64), Windows (x86_64) и macOS (x86_64, AArch64). Еталонната реализация на Java 20, разработена в рамките на проекта OpenJDK, е напълно отворена под лиценз GPLv2 с изключения GNU ClassPath, позволяващи динамично свързване с търговски продукти.
Java SE 20 е класифицирана като версия с нормален срок на поддръжка, обновления за която ще бъдат издавани до следващото издание. За дълготрайна поддръжка (LTS) следва да се използва Java SE 17, за която обновления ще се издават до 2029 година. Напомняме, че от версия Java 10 проектът премина на нов процес на разработка, който предвижда по-къс цикъл на генериране на нови издания. Новата функционалност сега се развива в една постоянно обновявана главна клонка, в която се включват готовите промени и от която на всеки шест месеца се отклоняват клонове за стабилизиране на новите издания.
От нововъведенията в Java 20 могат да се отбележат:
- Предложена предварителна поддръжка на ограничени стойности (Scoped Values), позволяващи ефективно споделяне на неизменяеми данни в потоците и обмен на информация между дъщерните потоци (стойностите се наследяват). Scoped Values се развиват, за да заменят механизма на локалните за потока променливи (thread-local variables) и са по-ефективни при използване на много виртуални потоци (хиляди и милиони потоци). Основната разлика между Scoped Values и локалните променливи на потока е, че първите се записват само веднъж, след което не могат да бъдат променяни и остават достъпни само по време на изпълнение на потока. class Server { final static ScopedValue CURRENT_USER = new ScopedValue(); void serve(Request request, Response response) { var level = (request.isAuthorized() ? ADMIN : GUEST); var user = new User(level); ScopedValue.where(CURRENT_USER, user) .run(() -> Application.handle(request, response)); } } class DatabaseManager { DBConnection open() { var user = Server.CURRENT_USER.get(); if (!user.canOpen()) throw new InvalidUserException(); return new DBConnection(…); } }
- Добавена е втора предварителна реализация на шаблони за записи (record pattern), разширяваща новата функционалност за съвпадение с образец, въведена в Java 16, използваща средствата за разбиране на стойности от класове тип record. Например: record Point(int x, int y) {} static void printSum(Object obj) { if (obj instanceof Point p) { int x = p.x(); int y = p.y(); System.out.println(x + y); } }
- Добавена е четвърта предварителна реализация на съвпадението по шаблон в изразите „switch“, позволяваща в метките „case“ да се използват не точни стойности, а гъвкави шаблони, обхващащи серия от стойности, за които по-рано се налагаше да се използват обемисти вериги от изрази „if…else“. static String formatterPatternSwitch(Object obj) { return switch (obj) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> o.toString(); }; }
- Добавена е втора предварителна реализация на API FFM (Foreign Function & Memory), позволяваща организиране на взаимодействие между Java програми и външен код и данни чрез извикване на функции от външни библиотеки и достъп до памет извън JVM.
- Добавена втора предварителна версия на виртуалните потоци, представляващи леки потоци, които значително опростяват написването и поддържането на високо производителни многопоточни приложения.
- Добавен е втори вариант на експерименталния API за структурирания паралелизъм, опростяващ разработката на многопоточни приложения, като обработва няколко задачи, изпълнявани в различни потоци, като единен блок.
- Добавена е петата предварителна версия на API Vector, предоставяща функции за векторни изчисления, които се изпълняват с помощта на векторни инструкции на процесори x86_64 и AArch64 и позволяват едновременно прилагане на операции към няколко стойности (SIMD). За разлика от предоставяните от JIT компилатора HotSpot възможности за автовекторизация на скаларни операции, новият API дава възможност за явно управление на векторизацията за паралелна обработка на данни.
Източник: opennet.ru
