Пасля шасці месяцаў распрацоўкі кампанія Oracle выпусціла платформа JavaSE 14 (Java Platform, Standard Edition 14), у якасці эталоннай рэалізацыі якой выкарыстоўваецца адчынены праект OpenJDK. У Java SE 14 захавана зваротная сумяшчальнасць з мінулымі выпускамі платформы Java, усё раней напісаныя Java-праекты без змен будуць працаздольныя пры запуску пад кіраваннем новай версіі. Гатовыя для ўсталёўкі зборкі Java SE 14 (JDK, JRE і Server JRE) падрыхтаваны для Linux (x86_64), Windows і macOS. Распрацаваная ў рамках праекту OpenJDK эталонная рэалізацыя Java 14 цалкам адкрыта пад ліцэнзіяй 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 -> «User has triggered the play button»;
case STOP, PAUSE -> "User needs a break";
default -> {
String message = event.toString();
LocalDateTime now = LocalDateTime.now();
yield «Unknown event » + message +
» logged on » + now;
}
};
Пашыраная эксперыментальная падтрымка тэкставых блокаў - новай формы радковых літаралаў, якія дазваляюць уключаць у зыходны код шматрадковыя тэкставыя дадзеныя без ужывання ў іх экранавання знакаў і захоўваючы зыходнае фарматавання тэксту ў блоку. Апраўленне блока ажыццяўляецца трыма падвойнымі двукоссямі. У Java 14 у тэкставых блоках рэалізавана падтрымка escape-паслядоўнасці "\" для вызначэння аднаго прабелу і "\" для аб'яднання з наступным радком (ігнаравання перакладу радка, калі трэба вывесці вельмі доўгі радок). Напрыклад, замест кода
Пашыраная інфарматыўнасць дыягностыкі пры ўзнікненні выключэнняў Выключэнне NullPointerException. Калі раней паведамленне пра памылку толькі спасылалася на нумар радка, то зараз у ім дэталізуецца які з метадаў выклікаў выключэнне. Пашыраная дыягностыка пакуль уключаецца толькі пры запуску са сцягам "-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) c намерам выдаліць дадзеныя парты ў будучыні. Перавод названых партоў у разрад састарэлых дазволіць супольнасці паскорыць распрацоўку новых магчымасцяў 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.