Ciekawe. Java 17 nie podążyła jednak tą samą ścieżką co jej poprzedniczki i została wypuszczona innego dnia, niż
wskazywałby na to numer jej wersji. Przypomnijmy, że wersje 15 i 16
ujrzały światło dzienne odpowiednio 15 września i 16 marca, a Java 17 status
General Availability uzyskała już 14 września.
Pytanie brzmi...co nowego w nowej Javie? Zobaczmy...
Java 17 - 14 września 2021
-
Pattern Matching for switch [preview]
W Javie 17 zostaje wprowadzona kolejna część zmian z cyklu obsługi dopasowania zmiennych do wzorca.
Do tej pory takie rozwiązanie zostało przygotowane dla operatora instanceof
(Java 14 już na horyzoncie oraz
Premiera Javy 16 GA),
a teraz pojawia się w wersji preview dla wyrażeń i instrukcji switch.
Zastosowanie dopasowania wzorców do switcha umożliwia testowanie zadanego wyrażenia względem wielu wzorców,
z których każdy ma przypisaną określoną akcję, dzięki czemu złożone zapytania zorientowane na dane
mogą być wyrażane bezpiecznie i zwięźle:
W powyższym przykładzie w etykiecie case nie porównujemy wartości, tylko typ testowanego obiektu.
Co ciekawe takie sprawdzenie może być użyte również do testowania null-a:
Bez tego udogodnienia w przypadku wystąpienia braku wartości otrzymamy NullPointerException.
Więcej przykładów związanych z dopasowaniem wzorca znajdziesz w oficjalnej dokumentacji dotyczącej tej nowości.
Dokumentacja ta jest dostępna pod adresem
https://openjdk.java.net/jeps/406.
- Sealed classes
W tym miejscu powtórzę to, na co zwróciłem uwagę, omawiając Javę 16. Przypomnę więc, że Sealed classes
były już omawiane w artykule Java 15 już we wrześniu.
Okazuje się, że w nowej wersji Javy poza tym, że Sealed classes nie są już oznaczane statusem preview,
w samej funkcjonalności nie zmienia się zupełnie nic.
Tak więc jedyną nowością w tym obszarze jest to, że Sealed classes można używać bez przełączania Javy w tryb podgląd i to akurat jest wartościowa zmiana.
-
Ulepszone generatory liczb pseudolosowych
Java 17 dostarcza nowe typy interfejsów i implementacje dla generatorów liczb pseudolosowych (PRNG).
Podstawowym interfejsem jest RandomGenerator, który zapewnia jednolite API dla
wszystkich liczb pseudolosowych. Interfejsy typu RandomGenerator dostarczają metody
o nazwach ints, longs, doubles,
nextBoolean, nextInt, nextLong,
nextDouble i nextFloat.
Interfejs RandomGenerator jest rozszerzany przez kilka bardziej wyspecjalizowanych interfejsów:
- SplittableRandomGenerator posiada wyżej wymienione metody, a dodatkowo sam zapewnia metody
split i splits. Cecha splittability
pozwala użytkownikowi stworzyć nowy obiekt typu RandomGenerator z istniejącego,
który będzie dawał statystycznie niezależne wyniki.
- JumpableRandomGenerator zapewnia metody o nazwach jump i jumps, które
pozwalają użytkownikowi przeskoczyć o pewną (umiarkowaną) liczbę losowań.
- LeapableRandomGenerator dodaje metody leap i leaps,
co pozwala na przeskoczenie dużej liczby losowań.
- ArbitrarilyJumpableRandomGenerator rozszerza LeapableRandomGenerator i zapewnia dodatkowe warianty
metod jump i jumps, pozwalające określić dowolną długość skoku.
-
Przywrócenie zawsze ścisłej semantyki liczb zmiennoprzecinkowych
Brzmi groźnie, ale o co właściwie chodzi? Otóż pod koniec lat 90 istniała zła interakcja między semantyką języka Java
a semantyką maszyny wirtualnej (JVM). Wówczas dopasowanie tych semantyk wymagałoby dużych kosztów tworzenia dodatkowych instrukcji.
Z tego powodu wybrano inne rozwiązanie, które polegało na wprowadzeniu poprawek do domyślnej semantyki zmiennoprzecinkowej
udostępnianej wtedy w Javie SE 1.2.
Nieco później pojawiły się procesory z rozszerzeniem SSE2 (Streaming SIMD Extensions 2)
dostarczane z procesorami Pentium 4 i nowszymi. Procesory te potrafią obsługiwać ścisłe operacje zmiennoprzecinkowe JVM
w prosty sposób bez zbędnych kosztów.
Ponieważ zarówno Intel, jak i AMD od dawna wspierają SSE2 i późniejsze rozszerzenia,
które umożliwiają naturalną obsługę ścisłej semantyki zmiennoprzecinkowej,
techniczna motywacja do posiadania domyślnej semantyki zmiennoprzecinkowej innej niż JVM nie jest już obecna.
I właśnie to przywrócenie jedynej słusznej (zawsze ścisłej) semantyki nastąpiło w Javie 17.
Innymi słowy, sama Java wraca do tego, co posiadała przez wypuszczeniem wersji Java SE 1.2.
-
Zdeprecjonowanie Security Manager-a
Security Manager pochodzi z Javy 1.0.
Od wielu lat nie jest to podstawowy sposób zabezpieczania kodu Java po stronie klienta
i rzadko jest używany do zabezpieczania kodu po stronie serwera.
W Javie 17 został on oznaczony jako deprecated i tym samym jest przeznaczony do usunięcia
w kolejnej wersji Javy. Zostały wykonane następujące kroki.
- Większość klas i metod została oznaczona adnotacją @Deprecated
- W przypadku gdy menedżer zabezpieczeń jest włączony podczas uruchamiania z wiersza poleceń,
nastąpi wyświetlenie komunikatu ostrzegawczego.
- Tak samo zostanie wyświetlony komunikat ostrzegawczy, jeśli aplikacja Java lub biblioteka dynamicznie zainstaluje Security Manager-a.
-
Interfejs API obcej funkcji i pamięci [incubator]
Na koniec wspomnę jeszcze o ciekawej, ale jednak dopiero raczkującej inicjatywie (dostępnej w ramach inkubatora),
a mianowicie o wprowadzeniu API obcej funkcji i pamięci (Foreign Function & Memory API). O co w tym chodzi?
Polega to na wprowadzeniu API, dzięki któremu programy Java mogą współdziałać z kodem i danymi poza środowiskiem wykonawczym Java.
Dzięki wydajnemu wywoływaniu obcych funkcji (tj. kodu spoza JVM) i bezpiecznemu dostępowi do obcej pamięci
(tj. pamięci niezarządzanej przez JVM), API umożliwia programom Java wywoływanie natywnych bibliotek i
przetwarzanie natywnych danych bez kruchości i niebezpieczeństwa JNI (Java Native Interface). Fajne.
Poza wymienionymi powyżej nowościami zostało przygotowanych jeszcze kilka innych, które nie wydają się wyjątkowo istotne.
Natomiast zawsze warto przyjrzeć się pełnej liście zmian i dlatego podajemy linka:
https://openjdk.java.net/projects/jdk/17.
Podsumowując zmiany wprowadzone w Javie 17, nam najbardziej podoba się kontynuacja zmian z obszaru dopasowania zmiennych do wzorca,
ponieważ stanowi to realny zysk dla programisty. Kod staje się bardziej zwięzły, a przez to bardziej przejrzysty i elastyczny w rozbudowie.
Dobrą informacją jest również udostępnienie Sealed classes do pełnego użytku, a więc bez potrzeby włączania trybu
preview.
Krótko mówiąc, wygląda na to, że coraz bardziej opłaca się przesiadać na nowsze wersje Javy, ponieważ faktycznie zaczyna się w nich pojawiać coraz więcej ulepszeń
wpływających na komfort pracy z kodem.
Autor: Jarek Klimas
Data: 14 września 2021
Labele:Backend, Poziom średniozaawansowany, Java
Linki:
https://openjdk.java.net
Masz pytanie odnośnie zagadnienia omawianego w artykule?
Coś, co napisaliśmy, nie zaspokoiło Twojego głodu wiedzy?
Daj nam znać co myślisz i skomentuj artykuł na facebooku!