Co nowego w Javie 21?
Przegląd najważniejszych zmian w języku i bibliotece

Java 21
To jest prawdziwa bomba! Java 21 to już zupełnie inny język. Zmiany, które pojawią się w wydaniu planowanym na wrzesień 2023, można z grubsza podzielić na dwie kategorie:
Zmiany w języku i bibliotekach

Oto najważniejsze i - moim zdaniem - najciekawsze zmiany, jakie czekają nas w Javie 21. Nie są one rewolucyjne, ale sprawiają, że pisanie kodu - oraz, co jest nawet dużo ważniejsze, jego czytanie - stanie się dużo łatwiejsze.
- kolekcje sekwencyjne
- wzorce dla rekordów
- wzorce w
switch
- wirtualne wątki
- wzorce tekstowe - preview
- wzorce i zmienne nienazwane (preview)
- klasy nienazwane (preview)
- scoped values czyli zmienne w zakresach dynamicznych (preview)
- structured concurrency czyli uporządkowana współbieżność (preview)
Pozostałe zmiany

To zmiany niskopoziomowe, ważne dla twórców bibliotek (API wektorowe, FFI, kryptografia) bądź związane z “oczyszczaniem” kodu. Są pewnie mniej interesujące dla typowego programisty, choć warto zajrzeć choćby do opisów w JEP–ach, aby z grubsza orientować się, czego dotyczą
- generacyjny ZGC
- API do obliczeń wektorowych - szósta tura w “inkubatorze”
- API do zabezpieczania kluczy symetrycznych
- wprowadzenie ostrzerzeń przy dynamicznym ładowaniu agentów
- przygotowaniue do usunięcia wsparcia dla 32-bitowego Windowsa
- API dostępu do zewnętrznej pamięci i zewnętrznych funkcji (FFI)
Po kolei
Kolekcje sekwencyjne
Wprowadzone zostały nowe interfejsy, które poprawnie zamodelują porządek napotykania elementów. Dotychczasowe API było dość chaotyczne: pobieranie pierwszego bądź ostatniego elementu z różnych kolekcjach miało różne API:
Struktura danych | First element | Last element |
---|---|---|
List | list.get(0) |
list.get(list.size() - 1) |
Deque | deque.getFirst() |
deque.getLast() |
SortedSet | ss.first() |
ss.last() |
LinkedHashSet | lhs.iterator().next() |
// missing |
Dwa nowe interfejsy to:
|
|
oraz
|
|
Wzorce dla rekordów
Pattern matching w Javie. Będzie można w końcu napisać tak:
|
|
Wzorce w ‘switch’
Wyrażenie wybierające gałąź nie musi być typu Enum, a w odnogach case można używać kwalifikowanych nazw wartości enumeracyjnych:
|
|
Wątki wirtualne
Jak je utworzyć:
- pojawił się nowy egzekutor
Executors.newVirtualThreadPerTaskExecutor()
- istnieje nowy
Thread.Builder
(early access JavaDoc API) - można je tworzyć przez
Thread.startVirtualThread(Runnable)
(javadoc) - ..lub przez Thread.ofVirtual()
Jakie mają cechy
- są zawsze demonowe (Thread.setDaemon(false) jest noop)
- mają ustalony i niezmienialny priorytet
- nie można przypisać ich do grupy wątków
- publiczny konstruktor zawsze tworzy wątki platformowe;
Dodatkowe API
- Thread.isVirtual() - można sprawdzić, z jakim wątkiem mamy do czynienia
- Thread.getAllStackTraces() zwraca mapę wątków platformowych (a nie wszystkoch)
Wzorce w napisach
To więcej, niż interpolacja napisów w innych językach. Ładne porównanie sposobów w JEP 430:
Language | Code |
---|---|
C# | $"{x} plus {y} equals {x + y}" |
Visual Basic | $"{x} plus {y} equals {x + y}" |
Python | f"{x} plus {y} equals {x + y}" |
Scala | s"$x plus $y equals ${x + y}" |
Groovy | "$x plus $y equals ${x + y}" |
Kotlin | "$x plus $y equals ${x + y}" |
JavaScript | `${x} plus ${y} equals ${x + y}` |
Ruby | "#{x} plus #{y} equals #{x + y}" |
Swift | "\(x) plus \(y) equals \(x + y)" |
W Javie będzie tak:
|
|
|
|
|
|
Structured concurrency
Główna klasa: StructuredTaskScope
Pozwala nadać strukturę zadaniu złożonemu z wielu zależnych, współbieżnych pod-zadań (funckja fork()
) i koordynować je: możemy użyć join()
dla całej grupy wyforkowanych z głównego zadania podzadań, możemy też użyć nowego API joinUntil(java.time.Instant)
; mamy też możliwość anulowania shutdown()
wszystkich podzadań na raz.
Zalety: lepsza obsługa błędów, propagowanie anulowania wątków (ale wciąż bez jawnego kontekstu), czytelna struktura kodu, czytelna struktura wątków w thread dump-ach:
|
|
Wzorce i zmienne nienazwane
Underscore tam, gdzie nie potrzebujemy wartości:
W switch
:
|
|
W for
:
|
|
…czy w blokach catch
:
|
|
Klasy nienazwane
… to ułatwienie w napisaniu ‘hello, world’. Poprawnym programem w Javie będzie taki kod:
|
|
Plan
W kolejnych wpisach sprawdzę dokładniej czego te zmiany dotyczą, opiszę je oraz użyję ich w prostych programach. Może uda mi się zrobić to przed GA?
Happy coding!
Obrazki
Obrazki wygenerowane przez AI w https://creator.nightcafe.studio/