Після шести місяців розробки компанія 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 доданий новий механізм розподілу пам'яті, що враховує специфіку роботи на великих системах, що використовують архітектуру NUMA. Новий розподільник пам'яті вмикається за допомогою прапора "+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.