Kurs Java

Co nowego w Javie 17?

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:
        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();
        };
    }
    
    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:
    static void testStringOrNull(Object o) {
        switch (o) {
            case null, String s -> System.out.println("String: " + s);
        }
    }
    
    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 swoje przemyślenia na temat artykułu? Podziel się nimi!
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!

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE