Java 19

W skrócie

Do Java 19 załapało się 7 JEPów. Wszystkie to tylko podglądy, albo inkubatory, ale zwiastują ciekawe zmiany. Najciekawsza zmiana to wirtualne wątki, ale pojawiają się również zmiany poprawiające jakość życia jak dopasowanie wzorców w rekordach i switchu. Tutaj znajdziesz aktualną listę zmian.

Java 19 w kontekście innych wersji

Java 19 jest zaplanowana na wrzesień 2022 roku. Jest to wydanie z krótkim, półrocznym okresem wsparcia, aż do wydania Java 20. Warto wspomnieć, że poprzednia wersja LTS (Long Time Support) to Java 17, a kolejna to Java 21.

Przegląd zmian

JEP 405: Record Patterns (Preview)

Rozszerzenie języka programowania Java o wzorce rekordów do dekonstrukcji wartości rekordów. Wzorce rekordów i typy mogą być zagnieżdżone, aby umożliwić potężną, deklaratywną i złożoną formę nawigacji i przetwarzania danych. Jest to tzw. preview feature, czyli element języka, który nie jest domyślnie włączony.

Jest to kolejne rozszerzenie możliwości dopasowywania wzorców. Przypomnę szybko, o co chodzi:

// Kiedyś 
if (o instanceof String) {
    String s = (String)o;
    ... use s ...
}

// Od Java 16
if (o instanceof String s) {
    ... use s ...
}

To samo podejście można aktualnie używać w przypadku rekordów:

    record Point(int x, int y) {
    }

    static void printSum(Object o) {
        if (o instanceof Point p) {
            int x = p.x();
            int y = p.y();
            System.out.println(x + y);
        }
    }

Autorzy chcą pójść o krok dalej i umożliwić dalszą dekonstrukcję. Będzie można od razu przypisać wartości do x i y:

record Point(int x, int y) {}

void printSum(Object o) {
    if (o instanceof Point(int x, int y)) {
        System.out.println(x+y);
    }
}

Ma to również działać dla zagnieżdżonych rekordów, ale po więcej informacji zapraszam do lektury u źródła: Link do JEP 405

JEP 422: Linux/RISC-V Port

Celem tego zadania jest dostarczenie JDK na architekturę procesora RISC-V. Implementacja jest już niemal gotowa i przechodzi testy, chodzi głównie do zintegrowanie tego wydania do głównego repozytorium JDK.

Link do JEP 422

JEP 424: Foreign Function & Memory API (Preview)

Wprowadzenie API, dzięki któremu programy Javy mogą współpracować z kodem i danymi spoza runtime Javy. Poprzez efektywne wywoływanie obcych funkcji (tj. kodu spoza JVM) oraz bezpieczny dostęp 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.

Link do JEP 424

JEP 425: Virtual Threads (Preview)

Wprowadzenie wątków wirtualnych do platformy Java. Wątki wirtualne to lekkie wątki, które radykalnie zmniejszają wysiłek związany z pisaniem, utrzymywaniem i obserwowaniem aplikacji współbieżnych o dużej wydajności.

Link do JEP 425

JEP 426: Vector API (Fourth Incubator)

Wprowadzenie API do wyrażania obliczeń wektorowych, które niezawodnie kompilują się w czasie pracy do optymalnych instrukcji wektorowych na obsługiwanych architekturach procesorów, osiągając w ten sposób wydajność wyższą niż równoważne obliczenia skalarne.

Link do JEP 426

JEP 427: Pattern matching for switch (Third Preview)

Trzecia iteracja zmian dotyczących dopasowywania szablonu w switchu. Chodzi o sytuację, w której w zależności od typu przekazanego obiektu wywołujemy w nim metody, bez potrzeby rzutowania.

    record Point(int i, int j) {}
    enum Color { RED, GREEN, BLUE; }

    static void typeTester(Object o) {
        switch (o) {
            case null     -> System.out.println("null");
            case String s -> System.out.println("String");
            case Color c  -> System.out.println("Color with " + c.values().length + " values"); // tutaj można wywołać metodę values(), poniewać c jest traktowane jako enum
            case Point p  -> System.out.println("Record class: " + p.toString());
            case int[] ia -> System.out.println("Array of ints of length" + ia.length); // ia traktowane jest jako tablica, więc można dostać się do pola length
            default       -> System.out.println("Something else");
        }
    }

Link do JEP 427

JEP 428: Structured Concurrency (Incubator)

Uprość programowanie wielowątkowe poprzez wprowadzenie API dla współbieżności strukturalnej. Współbieżność strukturalna traktuje wiele zadań działających w różnych wątkach jako pojedynczą jednostkę pracy, usprawniając w ten sposób obsługę błędów i anulowanie, poprawiając niezawodność i zwiększając obserwowalność.

Link do JEP 428

Podsumowanie

W tej wersji pojawiły się obiecujące zmiany podglądowe, szykuje się nam się ciekawe wydanie Java 20.

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.