След шестимесечна разработка, компания Oracle платформа (Java Platform, Standard Edition 14), чиято еталонна реализация е отвореният проект OpenJDK. Java SE 14 запазва обратно съвместимост с предишни версии на платформата Java, всички предишно написани Java проекти ще работят без изменения при стартиране с новата версия. Готовите за инсталация версии на Java SE 14 (JDK, JRE и Server JRE) за Linux (x86_64), Windows и macOS. Разработената в рамките на проекта OpenJDK еталонна реализация е напълно отворена под лицензия GPLv2 с изключения на GNU ClassPath, позволяващи динамично свързване с търговски продукти.
Java SE 14 е класифициран като версия с нормален срок на поддръжка, актуализации за която ще бъдат пуснати до следващото издание. За дългосрочна поддръжка (LTS) се препоръчва използването на Java SE 11, актуализации за която ще бъдат пуснати до 2026 година. Предишната LTS версия Java 8 ще се поддържа до декември 2020 година. Следващото LTS издание е планирано за септември 2021 година. Напомняме, че от изданието Java 10 проектът премина на нов процес на разработка, който предполага по-кратък цикъл на формиране на нови издания. Новата функционалност сега се разработва в постоянно обновяваща се master версия, в която се включват вече готови изменения и от която веднъж на шест месеца се отклоняват версии за стабилизиране на новите издания.
От :
- Добавена е експериментална поддръжка в операторът «instanceof», което позволява веднага да се определи локална променлива за достъп до проверената стойност. Например, може веднага да се пише «if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}» без явно определяне «String s = (String) obj».
Беше:
if (obj instanceof Group) {
Group group = (Group) obj;
var entries = group.getEntries();
}Сега може да се мине без определянето на «Group group = (Group) obj»:
if (obj instanceof Group group) {
var entries = group.getEntries();
} - Добавена е експериментална поддръжка на новото ключово слово ««, предоставящо компактен формат за определяне на класове, позволяващ да се мине без явно определяне на различни нискоуровневи методи, като equals(), hashCode() и toString(), в случаи, когато данните се запазват само в полета, поведението на които не се променя. Когато в класа се използват стандартни реализации на методите equals(), hashCode() и toString(), в него може да се мине без тяхното явно определяне:
public record BankTransaction(LocalDate date,
double amount,
String description) {}Това известие ще доведе до автоматично добавяне на реализации на методите equals(), hashCode() и toString(), в допълнение към конструктора и методите, контролиращи промяна на данни (getter).
- и по подразбиране е включена поддръжка на новата форма на изрази „switch“, която не изисква указване на оператора „break“, позволявайки обединяване на повтарящи се етикети и допускаща използване не само под формата на оператор, но и като израз.
var log = switch (event) {
case PLAY -> „Потребителят е активирал бутона за пускане“;
case STOP, PAUSE -> „Потребителят се нуждае от почивка“;
default -> {
String message = event.toString();
LocalDateTime now = LocalDateTime.now();
yield „Непознато събитие“ + message +
„ записано на „ + now;
}
}; - Разширена експериментална поддръжка — нова форма на текстови литерали, позволяваща вграждане на многострочни текстови данни в изходния код без необходимост от екраниране на символи и запазвайки оригиналното форматиране на текста в блока. Обрамчването на блока се извършва с три двойни кавички. В Java 14 в текстовите блокове е реализирана поддръжка на escape-последователността „\s“ за определяне на едно интервал и „\“ за обединяване с следващия ред (игнориране на новия ред, когато е нужно да се изведе много дълъг ред). Например, вместо кода
String html = „<HTML>” +
„\n\t” + „<BODY>” +
„\n\t\t” + „<H1>„Java 14 е тук!“</H1>” +
„\n\t” + „</BODY>” +
„\n” + „</HTML>”;може да се посочи:
String html = „"""
<HTML>
<BODY>
<H1>„Java 14"
е тук!“</H1>
</BODY>
</HTML>"""; - Разширена информативност на диагностиката при възникване на изключения . Ако преди съобщението за грешка само е указвало номера на реда, сега то подробно описва кой метод е предизвикал изключението. Разширената диагностика все още се активира само при стартиране с флага „-XX:+ShowCodeDetailsInExceptionMessages“. Например, при указването на този флаг, изключението на ред
var name = user.getLocation().getCity().getName();
ще доведе до показване на съобщението
Exception in thread „main“ java.lang.NullPointerException: Cannot invoke „Location.getCity()“
because the return value of „User.getLocation()“ is null
at NullPointerExample.main(NullPointerExample.java:5):5)което позволява да се разбере, че методът Location.getCity() не е бил извикан, а User.getLocation() е върнал стойност null.
- предварителна версия на утилитата jpackage, която позволява създаването на пакети за самостоятелни (self-contained) Java приложения. Утилитата се базира на javapackager от JavaFX и позволява формироването на пакети в формати, характерни за различни платформи (msi и exe за Windows, pkg и dmg за macOS, deb и rpm за Linux). Пакетите включват всички необходими зависимости.
- Събирач на боклук G1 нов механизъм за разпределение на паметта, който отчита спецификата на работа на големи системи, използващи архитектура . Новият разпределител на паметта се включва с флага «+XX:+UseNUMA» и позволява значително увеличаване на производителността на NUMA системи.
- API за проследяване в реално време на събития JFR (JDK Flight Recorder), например за организиране на непрекъснат мониторинг.
- модул jdk.nio.mapmode, предлагащ нови режими (READ_ONLY_SYNC, WRITE_ONLY_SYNC) за създаване на картографирани байтови буфери (MappedByteBuffer), които се отнасят до енергийно независима памет (NVM).
- предварителна версия на API Foreign-Memory Access, позволяваща на Java приложенията безопасно и ефективно да получават достъп до области на паметта, извън Java купчината, манипулирайки новите абстракции MemorySegment, MemoryAddress и MemoryLayout.
- остарели портове за операционната система Solaris и процесорите SPARC (Solaris/SPARC, Solaris/x64 и Linux/SPARC) с намерение да се премахнат тези портове в бъдеще. Обявяването на тези портове за остаряли ще позволи на общността да ускори разработката на нови функции на OpenJDK, без да губи време за поддържане на специфики, характерни за Solaris и SPARC.
- събирач на боклук CMS (Concurrent Mark Sweep), който беше обявен за остарял преди две години и остана без поддръжка (CMS отдавна беше заменен от събирача на боклук G1). Освен това, остарялото използване на комбинация от алгоритми за събиране на боклук ParallelScavenge и SerialOld (стартиране с опции «-XX:+UseParallelGC -XX:-UseParallelOldGC»).
- Осигурена е експериментална поддръжка на събирача на боклук ZGC (Z Garbage Collector) на платформите macOS и Windows (преди това поддържан само в Linux). ZGC работи в пасивен режим, доколкото е възможно минимизирайки забавянията поради събиране на боклук (времето на спиране при използване на ZGC не надвишава 10 мс.) и може да работи както с малки, така и с огромни купчини, с размер от няколко стотици мегабайта до много терабайта.
- инструменти и API за компресиране на JAR файлове с използване на алгоритъм Pack200.
Източник: opennet.ru
