Nasza strona używa cookies. Korzystając ze strony, wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki. Rozumiem

Java 17 - poznaj wszystkie nowości

Adam Kukołowicz CTO / Bulldogjob
Oto Java 17 i jej nowości. Zobacz wszystko, co wprowadzono w nowym wydaniu LTS Javy.
Java 17 - poznaj wszystkie nowości

Java 17 została dziś wydana. Co ważne jest to wydanie LTS, więc będzie wspierane aż przez 5 lat. Dlatego szczególnie warto przyjrzeć się nowościom. W tej wersji wcielono 14 JEP-ów (JDK Enhancement Proposal) i przejdziemy przez nie wszystkie, żeby zobaczyć, co tak naprawdę zawiera nowe wydanie.


Klasy zapieczętowane

To chyba największa nowość w Javie 17. Klasy zapieczętowane (JEP 409) wychodzą z fazy preview i stają się częścią standardowej Javy. Tego typu klasy (i interfejsy) pozwalają ograniczyć, które klasy mogą je rozszerzać lub implementować. Oto przykład:

package com.example.geometry;

public abstract sealed class Shape 
    permits com.example.polar.Circle,
            com.example.quad.Rectangle,
            com.example.quad.simple.Square { ... }


Warto też tu wspomnieć o 3 warunkach, które muszą spełnić klasy zapieczętowane:
- klasa zapieczętowana i jej podklasy muszą należeć do tego samego modułu lub pakietu (jeżeli moduł jest nienazwany)

  • Każda podklasa musi wprost rozszerzać klasę zapieczętowaną
  • Każda podklasa musi określić, jak będzie się propagować zapieczętowanie (można określić tu modyfikator final, selead i kontynuować temat lub non-sealed i otworzyć tym samym klasę)


Bezpieczniejsza deserializacja

Deserializowanie danych niewiadomego pochodzenia może być niebezpieczne, dlatego jedną z nowości jest wybieranie filtrów do deserializacji w konkretnym kontekście za pomocą pojedynczej fabryki filtrów (JEP 415). Wcześniej można było korzystać ze statycznego filtra dla całego JVM lub ewentualnie zmienić go na inny. Teraz za każdym razem, gdy tworzymy ObjectInputStream, to fabryka filtrów zwraca nam filtr, który jest dynamiczny i dopasowany do kontekstu. Filtry wprowadzone w Javie 9 nadal będą działać tak, jak działały, o ile nie pojawi się nowa implementacja.


Funkcje eksperymentalne

Od Javy 14 mamy nową składnię switch, od Javy 16 mamy dopasowanie wzorców, więc możecie się domyślić, co przynosi obecna wersja. Tak, Java 17 daje dopasowanie wzorców w switch (JEP 406, jest to funkcja preview). To nic dziwnego, biorąc pod uwagę, że od początku było to celem wprowadzenia “pattern matchingu”. Funkcja ta pozwala zrobić coś takiego:

static String formatterPatternSwitch(Object o) {
    return switch (o) {
        case Integer i -> String.format("int %d", i);
        case Long l    -> String.format("long %d", l);
        case Double d  -> String.format("double %f", d);
        case String s  -> String.format("String %s", s);
        default        -> o.toString();
    };
}


To ładna i zwięzła składnia, podobna do tej, w innych językach programowania, jak C# czy Ruby. 

Poziom niżej, czyli jako funkcje w inkubatorze mamy dwa JEP-y. Pierwszy, JEP 412, to kolejny etap prac na API do wywoływania obcego kodu i zarządzania pamięcią poza stosem Javy. Celem jest tu zastąpienie JNI.

Po raz drugi w inkubatorze pojawia się Vector API (JEP 414), które, jak nazwa wskazuje, ma umożliwić łatwe operowanie na wektorach. Tym razem pojawiły się tylko drobne poprawki, związane z feedbackiem społeczności.


Usprawnienia

JEP 306 zapewni, że operacje zmiennoprzecinkowe będą od teraz zawsze wykonywane w trybie strict. Java SE 1.2 wprowadziła zamieszanie dając możliwość używania trybu strict lub default. Dla osób, które nie siedzą po uszy w operacjach zmiennoprzecinkowych, może nie być dużej różnicy, jednak ułatwi to życie developerom bibliotek obliczeniowych.

Porządków doczekały się też generatory pseudolosowe (JEP 356), tu znowu chodziło o uzyskanie spójnego interfejsu, który zapewni “przewidywalne” i bezpieczne wyniki. Nowy interfejs nazywa się RandomGenerator, ale mało prawdopodobne, że będziesz go kiedykolwiek używać bezpośrednio, raczej będą z niego korzystać PRNG.

Nie będzie można dobrać się już do wnętrzności JDK (JEP 403), chodzi tu głównie o metody i pola z pakietów org.*, jdk.*, com.sun.*. Od Javy 9 do Javy 16 dostęp do nich był możliwy, jeżeli użyło się odpowiedniej flagi, teraz już nie będzie to możliwe.


Java 17 dla Maca

Po pierwsze Java zadziała na Apple Silicon dzięki JEP 391, czyli od teraz nie powinno być problemów w Javą na M1. Druga nowość to nowe API do rysowania na macOS (JEP 382). Używa ono Apple Metal API, co stwarza alternatywę dla Apple OpenGL, które jest już przestarzałe.


Do wyrzucenia

Jak zawsze usuwane jest parę funkcji:

  • API appletów zostaje oznaczone jako przestarzałe i do usunięcia (JEP 398)
  • Usunięcie Remote Method Invocation (RMI) Activation, przy czym RMI zostaje w Javie (JEP 407)
  • Usunięcie eksperymentalnych kompliatorów JIT i AOT (JEP 410) - tu zalecane jest użycie zewnętrznych narzędzi i kompilatorów, np. GraalVM
  • Security Manager, czyli narzędzie do zabezpieczania kodu klienckiego w Javie, zostaje oznaczone jako do usunięcia


Podsumowanie

Java 17 może nie dostarcza porywających nowości, w końcu przez 6 miesięcy nie można wprowadzić zbyt wielu zmian. W zasadzie stabilizuje on zmiany, które pojawiały się w przeciągu ostatnich paru wersji i utrwala kanon funkcji, które będą szerzej wykorzystywane przez kilka następnych lat w świecie Javy.

Pamiętajcie, że od ostatniego LTS, czyli od września 2018, pojawiły się w Javie:

  • Rekordy
  • Nowa składnia switch
  • Dopasowanie wzorców
  • Klasy zapieczętowane
  • Nowa składnia dla wielolinijkowych bloków tekst


I to całkiem spore zmiany, biorąc pod uwagę, że mówimy o tak dojrzałym języku jak Java.

Rozpocznij dyskusję

Lubisz dzielić się wiedzą i chcesz zostać autorem?

Podziel się wiedzą z 160 tysiącami naszych czytelników

Dowiedz się więcej