Випуск Java SE 14

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

З нововведень Java 14 можна зазначити:

  • Додана експериментальна підтримка зіставлення зі зразком в операторі "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-послідовності \ для визначення одного пропуску і \ для об'єднання з наступним рядком (ігнорування перекладу рядка, коли потрібно вивести дуже довгий рядок). Наприклад, замість коду

    String html = « » +
    "\n\t" + " » +
    "\n\t\t" + " "Java 1 is here!" » +
    "\n\t" + " » +
    "\n" + " »;

    можна вказати:

    String html = «»»


    »Java 1 \
    is here!»

    »»»;

  • Розширено інформативність діагностики при виникненні винятків 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.

Джерело: opennet.ru

Додати коментар або відгук