wydanie Javy SE 15

Po sześciu miesiącach rozwoju Oracle wydany platforma Jawa SE 15 (Java Platform, Standard Edition 15), projekt OpenJDK o otwartym kodzie źródłowym służy jako implementacja referencyjna. Java SE 15 zachowuje kompatybilność wsteczną z poprzednimi wydaniami platformy Java; wszystkie wcześniej napisane projekty Java będą działać bez zmian po uruchomieniu w nowej wersji. Gotowe do instalacji kompilacje Java SE 15 (JDK, JRE i Server JRE) przygotowany dla systemu Linux (x86_64), Windows i macOS. Implementacja referencyjna opracowana w ramach projektu OpenJDK Java 15 jest w pełni open source na licencji GPLv2, z wyjątkami GNU ClassPath umożliwiającymi dynamiczne łączenie z produktami komercyjnymi.

Java SE 15 jest klasyfikowana jako zwykła wersja wsparcia i będzie otrzymywać aktualizacje aż do następnej wersji. Gałązką wsparcia długoterminowego (LTS) powinna być Java SE 11, która będzie otrzymywać aktualizacje do 2026 roku. Poprzednia gałąź LTS Java 8 będzie obsługiwana do grudnia 2020 r. Następna wersja LTS zaplanowana jest na wrzesień 2021 r. Przypomnijmy, że począwszy od wydania Java 10, projekt przeszedł na nowy proces rozwoju, co oznacza krótszy cykl tworzenia nowych wydań. Nowa funkcjonalność jest obecnie rozwijana w jednej, stale aktualizowanej gałęzi głównej, która zawiera gotowe zmiany i z której co sześć miesięcy odgałęziają się gałęzie w celu stabilizacji nowych wydań.

Z innowacje Java 15 można znak:

  • Wbudowany obsługa algorytmu tworzenia podpisu cyfrowego EdDSA (Edwards-Curve Digital Signature Algorithm) RFC 8032). Proponowana implementacja EdDSA jest niezależna od platform sprzętowych, jest zabezpieczona przed atakami typu side-channel (zapewniony jest stały czas wszystkich obliczeń) i działa szybciej niż istniejąca implementacja ECDSA napisana w języku C, przy tym samym poziomie ochrony. Na przykład EdDSA wykorzystująca krzywą eliptyczną z kluczem 126-bitowym wykazuje podobną wydajność jak ECDSA z krzywą eliptyczną secp256r1 i kluczem 128-bitowym.
  • Dodany eksperymentalne wsparcie dla zapieczętowanych klas i interfejsów, których inne klasy i interfejsy nie mogą używać do dziedziczenia, rozszerzania lub zastępowania implementacji. Klasy zapieczętowane zapewniają również bardziej deklaratywny sposób ograniczenia użycia nadklasy niż modyfikatory dostępu, w oparciu o jawną listę podklas dozwolonych do rozszerzenia.

    pakiet com.example.geometry;

    publiczna klasa zapieczętowana Shape
    zezwolenia com.example.polar.Circle,
    com.przykład.quad.Prostokąt,
    com.example.quad.simple.Square {…}

  • Dodany obsługa ukrytych klas, których nie można bezpośrednio wykorzystać w kodzie bajtowym innych klas. Kluczowym celem klas ukrytych jest zastosowanie w frameworkach, które dynamicznie generują klasy w czasie wykonywania i wykorzystują je pośrednio, poprzez odbicie. Klasy takie mają zwykle ograniczony cykl życia, więc utrzymywanie ich w celu uzyskania dostępu z klas generowanych statycznie nie jest uzasadnione i doprowadzi jedynie do zwiększonego zużycia pamięci. Ukryte klasy eliminują także potrzebę stosowania niestandardowego interfejsu API sun.misc.Unsafe::defineAnonymousClass, który w przyszłości ma zostać usunięty.
  • Śmieciarka ZGC (Z Garbage Collector) została ustabilizowana i uznana za gotową do powszechnego użytku. ZGC działa w trybie pasywnym, maksymalnie minimalizuje opóźnienia spowodowane zbieraniem śmieci (czas przestoju przy użyciu ZGC nie przekracza 10 ms.) i może pracować zarówno z małymi, jak i dużymi stertami, o wielkości od kilkuset megabajtów do wielu terabajtów.
  • Ustabilizowany i uznany za gotowy do ogólnego użytku
    Śmieciarz Shenandoah, pracując z minimalnymi przerwami (Kolektor elementów bezużytecznych o niskim czasie pauzy). Shenandoah został opracowany przez firmę Red Hat i wyróżnia się wykorzystaniem algorytmu, który skraca czas przestoju podczas usuwania elementów bezużytecznych, uruchamiając czyszczenie równolegle z wykonywaniem aplikacji Java. Wielkość opóźnień wprowadzanych przez moduł zbierający śmieci jest przewidywalna i nie zależy od wielkości sterty, tj. dla stert 200 MB i 200 GB opóźnienia będą identyczne (nie wychodź powyżej 50 ms i zwykle w ciągu 10 ms);

  • Wsparcie zostało ustabilizowane i wprowadzone do języka bloki tekstowe - nowa forma literałów łańcuchowych, która pozwala na włączenie wieloliniowych danych tekstowych do kodu źródłowego bez stosowania zmiany znaczenia znaków i zachowania oryginalnego formatowania tekstu w bloku. Blok jest otoczony trzema podwójnymi cudzysłowami.

    Na przykład zamiast kodu

    Ciąg HTML = " » +
    "\n\t" + " » +
    "\n\t\t" + " „Java 1 jest już dostępna!” » +
    "\n\t" + " » +
    "\n" + " ";

    możesz określić:

    Ciąg html = """


    »Java 1\
    jest tutaj!

    „””;

  • Przerobione Starszy interfejs API DatagramSocket. Stare implementacje java.net.DatagramSocket i java.net.MulticastSocket zostały zastąpione nowoczesną implementacją, łatwiejszą w debugowaniu i utrzymaniu, a także kompatybilną ze strumieniami wirtualnymi opracowanymi w ramach projektu Ospały. W przypadku ewentualnej niezgodności z istniejącym kodem stara implementacja nie została usunięta i można ją włączyć za pomocą opcji jdk.net.usePlainDatagramSocketImpl.
  • Zaproponowano drugą eksperymentalną implementację dopasowanie wzoru w operatorze „instanceof”, który umożliwia natychmiastowe zdefiniowanie zmiennej lokalnej umożliwiającej dostęp do sprawdzanej wartości. Na przykład możesz od razu napisać „if (obj instancja String s && s.length() > 5) {.. s.contains(..) ..}” bez jawnego definiowania „String s = (String) obj”.

    To było:

    if (instancja obiektu grupy) {
    Grupa grupa = (Grupa) obiekt;
    var wpisy = group.getEntries();
    }

    Teraz możesz obejść się bez definicji „Grupa grupowa = (Grupa) obj”:

    if (instancja obiektu grupy grupa) {
    var wpisy = group.getEntries();
    }

  • Zasugerował druga eksperymentalna implementacja słowa kluczowego „rekord", który zapewnia zwartą formę definiowania klas, pozwalającą uniknąć jawnego definiowania różnych metod niskiego poziomu, takich jak równości(), hashCode() i toString() w przypadkach, gdy dane są przechowywane tylko w polach, których zachowanie się nie zmienia. Kiedy klasa używa standardowych implementacji metod równości(), hashCode() i toString(), może obejść się bez ich wyraźnej definicji:

    publiczny rekord BankTransaction (data LocalDate,
    podwójna ilość
    Opis ciągu) {}

    Ta deklaracja automatycznie doda implementacje metod równości(), hashCode() i toString() oprócz metod konstruktora i gettera.

  • Zaproponowano druga wersja zapoznawcza interfejsu API dostępu do pamięci zagranicznej, umożliwiająca aplikacjom Java bezpieczny i wydajny dostęp do obszarów pamięci poza stertą Java poprzez manipulowanie nowymi abstrakcjami MemorySegment, MemoryAddress i MemoryLayout.
  • Wyłączony i wycofano technikę optymalizacji Biased Locking stosowaną w HotSpot JVM w celu zmniejszenia narzutu związanego z blokowaniem. Technika ta straciła na znaczeniu w systemach z instrukcjami atomowymi dostarczanymi przez nowoczesne procesory i jest zbyt pracochłonna w utrzymaniu ze względu na swoją złożoność.
  • Ogłoszony przestarzały mechanizm Aktywacja RMI, które zostaną usunięte w przyszłej wersji. Należy zauważyć, że aktywacja RMI jest przestarzała, zdegradowana do kategorii opcji w Javie 8 i prawie nigdy nie jest stosowana we współczesnej praktyce.
  • REMOVED Silnik JavaScript nosorożec, który był przestarzały w Java SE 11.
  • Usunięto porty dla procesorów Solaris OS i SPARC (Solaris/SPARC, Solaris/x64 i Linux/SPARC). Usunięcie tych portów umożliwi społeczności przyspieszenie rozwoju nowych funkcji OpenJDK bez marnowania czasu na utrzymywanie funkcji specyficznych dla systemów Solaris i SPARC.

Źródło: opennet.ru

Dodaj komentarz