Выпуск 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 дададзены новы механізм размеркавання памяці, які ўлічвае спецыфіку працу на буйных сістэмах, якія выкарыстоўваюць архітэктуру НУМА. Новы размеркавальнік памяці ўключаецца пры дапамозе сцяга "+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.

Крыніца: opennet.ru

Дадаць каментар