Wydanie Java SE 14

Po sześciu miesiącach prac rozwojowych firma Oracle wydała platformę Java SE 14 (Java Platform, Standard Edition 14), którego standardową implementacją jest otwarty projekt OpenJDK. W Java SE 14 zachowana jest zgodność wsteczna z wcześniejszymi wersjami platformy Java, więc wszystkie wcześniej napisane projekty Java będą działać bez zmian na nowej wersji. Gotowe do zainstalowania zestawy Java SE 14 (JDK, JRE i Server JRE) przygotowano dla systemów Linux (x86_64), Windows i macOS. Wzorcowa implementacja opracowana w ramach projektu OpenJDK Java 14 jest w pełni otwarta na licencji GPLv2 z wyjątkami GNU ClassPath, które umożliwiają dynamiczne łączenie z produktami komercyjnymi.

Java SE 14 został zaklasyfikowany jako wydanie o standardowym okresie wsparcia, aktualizacje będą wydawane do następnej wersji. Dla wersji o długoterminowym wsparciu (LTS) należy używać Java SE 11, której aktualizacje będą dostępne do 2026 roku. Poprzednia gałąź LTS Java 8 będzie wspierana do grudnia 2020 roku. Następne wydanie LTS planowane jest na wrzesień 2021 roku. Przypominamy, że od wydania Java 10 projekt przeszedł na nowy proces rozwoju, obejmujący krótsze cykle tworzenia nowych wersji. Nowa funkcjonalność rozwija się teraz w jednej ciągle aktualizowanej gałęzi głównej, do której włączane są już gotowe zmiany, a co sześć miesięcy odgałęzają się gałęzie stabilizacyjne nowych wydań.

Z nowości Java 14 można zaznaczyć:

  • Dodano eksperymentalne wsparcie dopasowania wzoru w operatorze „instanceof”, który pozwala na natychmiastowe określenie lokalnej zmiennej do dostępu do zweryfikowanej wartości. Na przykład, można od razu napisać „if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}” bez wyraźnego określania „String s = (String) obj”.

    Było:

    if (obj instanceof Group) {
    Group group = (Group) obj;
    var entries = group.getEntries();
    }

    Teraz można obejść się bez definiowania „Group group = (Group) obj”:

    if (obj instanceof Group group) {
    var entries = group.getEntries();
    }

  • Dodano eksperymentalne wsparcie dla nowego słowa kluczowego „record„, które dostarcza kompaktowej formy do definiowania klas, pozwalającej na brak wyraźnego definiowania różnych niskopoziomowych metod, takich jak equals(), hashCode() i toString(), w przypadkach, gdy dane są przechowywane tylko w polach, a zachowanie pracy z nimi nie zmienia się. Gdy w klasie używane są typowe implementacje metod equals(), hashCode() i toString(), można obejść się bez ich wyraźnego definiowania:

    public record BankTransaction(LocalDate date,
    double amount,
    String description) {}

    Ta deklaracja spowoduje automatyczne dodanie implementacji metod equals(), hashCode() i toString() w dodatku do konstruktora oraz metod zarządzających zmianą danych (getter).

  • Standaryzowano i włączono domyślnie wsparcie dla nowej formy wyrażeń „switch”, która nie wymaga określenia operatora „break”, pozwalającej na łączenie powtarzających się etykiet i dopuszczającej użycie nie tylko w formie operatora, ale także jako wyrażenie.

    var log = switch (event) {
    case PLAY -> „Użytkownik aktywował przycisk odtwarzania”;
    case STOP, PAUSE -> „Użytkownik potrzebuje przerwy”;
    default -> {
    String message = event.toString();
    LocalDateTime teraz = LocalDateTime.now();
    yield "Nieznane zdarzenie " + message +
    " zalogowane na " + teraz;
    }
    };

  • Rozszerzone wsparcie eksperymentalne bloków tekstowych — nowego rodzaju literałów stringowych, które pozwalają na wprowadzenie do kodu źródłowego wielowierszowych danych tekstowych bez potrzeby ich eskalowania oraz zachowując oryginalne formatowanie tekstu w bloku. Obudowa bloku realizowana jest za pomocą trzech podwójnych cudzysłowów. W Javie 14 w blokach tekstowych wprowadzono wsparcie dla sekwencji ucieczki "\s" dla oznaczenia jednego spacji oraz "\" do łączenia z następnym wierszem (ignorowania przejścia do nowej linii, gdy potrzebne jest wyświetlenie bardzo długiego wiersza). Na przykład, zamiast kodu

    String html = "<HTML>" +
    "\n\t" + "<BODY>" +
    "\n\t\t" + "<H1>\"Java 14 jest dostępna!\"<\/H1>" +
    "\n\t" + "<\/BODY>" +
    "\n" + "<\/HTML>";

    można wskazać:

    String html = """
    <HTML>
    <BODY>
    <H1>"Java 14\
    jest dostępna!"<\/H1>
    <\/BODY>
    <\/HTML>""";

  • Zwiększona informacyjność diagnostyki w przypadku wystąpienia wyjątków NullPointerException. Jeśli wcześniej komunikat o błędzie wskazywał tylko na numer linii, to teraz szczegółowo opisuje, która z metod wywołała wyjątek. Rozszerzona diagnostyka jest obecnie włączana tylko przy uruchomieniu z flagą "-XX:+ShowCodeDetailsInExceptionMessages". Na przykład, przy podaniu tej flagi wyjątek w linii

    var name = user.getLocation().getCity().getName();

    spowoduje wygenerowanie komunikatu

    Exception in thread "main" java.lang.NullPointerException: Nie można wywołać "Location.getCity()"
    ponieważ wartość zwracana przez "User.getLocation()" jest równa null
    w NullPointerExample.main(NullPointerExample.java:5):5)

    co pozwala zrozumieć, że metoda Location.getCity() nie została wywołana, a User.getLocation() zwrócił wartość null.

  • Zrealizowano wstępna wersja narzędzia jpackage, które umożliwia tworzenie pakietów dla samodzielnych (self-contained) aplikacji Java. Narzędzie opiera się na javapackager z JavaFX i umożliwia tworzenie pakietów w formatach natywnych dla różnych platform (msi i exe dla Windows, pkg i dmg dla macOS, deb i rpm dla Linux). Pakiety zawierają wszystkie niezbędne zależności.
  • W zbieraczu śmieci G1 dodano nowy mechanizm zarządzania pamięcią, uwzględniający specyfikę pracy na dużych systemach wykorzystujących architekturę NUMA. Nowy przydzielacz pamięci włącza się przy pomocy flagi "+XX:+UseNUMA" i pozwala znacznie zwiększyć wydajność na systemach NUMA.
  • Dodano API do monitorowania wydarzeń JFR (JDK Flight Recorder) w czasie rzeczywistym, na przykład do organizacji ciągłego monitorowania.
  • Dodano moduł jdk.nio.mapmode, oferujący nowe tryby (READ_ONLY_SYNC, WRITE_ONLY_SYNC) do tworzenia mapowanych buforów bajtowych (MappedByteBuffer), odnoszących się do pamięci nieulotnej (NVM).
  • Zrealizowano wstępna wersja API Foreign-Memory Access, umożliwiająca aplikacjom Java bezpieczny i efektywny dostęp do obszarów pamięci poza stertą Java, manipulując nowymi abstrakcjami MemorySegment, MemoryAddress i MemoryLayout.
  • Ogłoszono zdeaktualizowane porty dla systemu operacyjnego Solaris i procesorów SPARC (Solaris/SPARC, Solaris/x64 i Linux/SPARC) z zamiarem ich usunięcia w przyszłości. Przeklasyfikowanie tych portów jako zdeaktualizowanych pozwoli społeczności przyspieszyć rozwój nowych możliwości OpenJDK, nie tracąc czasu na utrzymanie funkcji specyficznych dla Solaris i SPARC.
  • Usunięto zgromadzenie śmieci CMS (Concurrent Mark Sweep), które dwa lata temu zostało oznaczone jako zdeaktualizowane i pozostało bez wsparcia (na jego miejscu od dawna jest zbieracz śmieci G1). Ponadto, ogłoszono zdeaktualizowane zastosowanie kombinacji algorytmów zbierania śmieci ParallelScavenge i SerialOld (uruchomienie z opcjami "-XX:+UseParallelGC -XX:-UseParallelOldGC").
  • Zapewniłem eksperymentalne wsparcie dla zbieracza śmieci ZGC (Z Garbage Collector) na platformach macOS i Windows (wcześniej wspierany tylko w Linuxie). ZGC działa w trybie pasywnym, maksymalnie minimalizując opóźnienia spowodowane zbieraniem śmieci (czas zatrzymania podczas korzystania z ZGC nie przekracza 10 ms) i może działać zarówno z małymi, jak i olbrzymimi stertami, wielkości od kilku setek megabajtów do wielu terabajtów.
  • Usunięto narzędzie i API do kompresji plików JAR z wykorzystaniem algorytmu Pack200.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster