Dzisiaj mamy premierę długo oczekiwanej JDK 21. Dlatego też dzisiejszą edycje skupimy sobie na niej.
Dzisiaj temat mógł być tylko jeden. Premiera JDK 21.
Oficjalny blog post znajdziecie tutaj, a oficjalny stream z zapowiedzi tutaj, ale ja mam dla Was odrobinkę więcej.
Z uwagi na liczbę nowych funkcji, nie mogę zagłębiać się w każdą z nich. Postanowiłem więc przeprowadzić mały eksperyment – zamierzam przedstawić każdą funkcję w jednym zdaniu oraz poprzez fragment kodu (dla stabilnych funkcjonalności). Stali czytelnicy już tego typu opracowanie widzieli, ale żeby nie było że się lenie – dodatkowo, do do prawie wszystkich stabilnych funkcjonalności dołożyłem zestaw materiałów dodatkowych, które pozwalają lepiej zrozumieć poszczególne „featury”.
Dlatego bez zbędnego przedłużania, zaczynamy, bo i tak dużo przed nami:
Stabilne
431: Sequenced Collections
W wypadku uporządkowanych kolekcji, wprowadzono spójny interfejs do pobierania pierwszego i ostatniego elementu, a także odwracania sekwencji.
interface SequencedCollection<E> extends Collection<E> {
// new method
SequencedCollection<E> reversed();
// methods promoted from Deque
void addFirst(E);
void addLast(E);
E getFirst();
E getLast();
E removeFirst();
E removeLast();
}
Materiały dodatkowe
- Java 21’s New (Sequenced) Collections – Prezentacja wideo z Inside Java Newscast, prezentująca oryginalny JEP. Posiada też tekstowy suplement
439: Generational ZGC
Jako, że prawdopodobieństwo konieczności „sprzątania” przez GC zmniejsza się wraz z czasem życia danego obiektu, posiadanie innego pipeline dla krótko i długo żyjących obiektów jest standardem w GC, a teraz trafia też do ZGC.
Materiały dodatkowe
- Garbage Collector Implementation – Generational Garbage Collection – Tekst Oracle opisujący hipotezę generacyjną w kontekście HotSpot VM.
- JEP 377: ZGC: A Scalable Low-Latency Garbage Collector – oryginalny JEP wprowadzający samo ZGC.
- An Introduction to ZGC: A Scalable and Experimental Low-Latency Garbage Collector – Przystępne wprowadzenie do samego ZGC. Wprawdzie ZGC już nie jest tak bardzo „experimental”, ale sam tekst jest regularnie aktualizowany (ostatni raz w poniedziałek 18 października).
- An Introduction to ZGC: A Scalable and Experimental Low – Prezentacja z JavaOne na temat ZGC.
- Inside Java Podcast – Episode 24 “Towards Generational ZGC!” – Oficjalny Podcast Javy, opisujące „kuchnie” pracy nad Generacyjnym ZGC.
440: Record Patterns
Możliwość łatwej dekonstrukcja Rekordów, umożliwiająca wyciągnięcie z nich konkretnych pól, a także używanie w pattern matchingu (kolejny JEP).
if (obj instanceof Point(int x, int y)) {
System.out.println(x+y);
}
Materiały dodatkowe
- What good are Record Patterns in Java? An example based on Spark’s Catalyst Optimizer and it’s Tree Rewriting Rules – artykuł z nietrywialnymi przykładami.
- Data Oriented Programming in Java – tekst prezentujący założenia stojące za rekordami, pattern matchingiem i innymi nowymi elementami składni języka w Javie. IMHO lektura obowiązkowa do lepszego zrozumienia jego ewolucji 🚨. Aplikuje się też do poniższego👇
441: Pattern Matching for switch
Możliwość użycia switch do pattern matchingu, z uwzględnieniem zaawansowanych opcji.
static String formatterPatternSwitch(Object obj) {
return switch (obj) {
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 -> obj.toString();
};
}
Materiały dodatkowe
- Data Oriented Programming in Java – tak jak do JEP 440, tak i tutaj bardzo zachęcam do zapoznania się.
444: Virtual Threads
Wprowadzenie do JVM konceptu wątków zarządzanych nie przez system operacyjny, a przez samą maszynę wirtualną.
Thread.builder().virtual().factory();
Materiały dodatkowe
- All together now: Spring Boot 3.2, GraalVM native images, Java 21, and virtual threads with Project Loom – Tekst prezentujący stanowisko Springa, jeśli chodzi o implementacje Projekt Loom.
- Helidon Níma – Pierwszy Javowy Framework napisany od podstaw pod kątem wsparcia Wirtualnych Wątków – pojawi się jako część Helidon 4.0.0
- Virtual Thread Support Reference in Quarkus – opis wsparcia Wirtualnych Wątków trzeci z dużych javowych frameworków.
- What is blocking in Loom? – Tekst opisujący z detalami problem „pinningu” threadów.
- Implementing Raft using Project Loom – Jak w tytule, przykład użycia wirtualnych wątków do implementacji Rafta.
- The Ultimate Guide to Java Virtual Threads – świetny kurs Virtual Threads z Rock the JVM Blog.
449: Deprecate the Windows 32-bit x86 Port for Removal
451: Prepare to Disallow the Dynamic Loading of Agents
W celu zwiększenia bezpieczeństwa Javy, twórcy planują w przyszłości zabronić ładowania pewnych kategorii Agentów Maszyny Wirtualnej bez podania specjalnej flagi.
Materiały dodatkowe
- A beginner’s guide to Java agents – Szybkie wprowadzenie do tematu Agentów Javowych z Java Advent Calendar (bardzo fajna coroczna inicjatywa, ciekawe co szykuj).
- The definitive guide to Java agents by Rafael Winterhalter – To samo, tylko mocno poszerzone i w formie wideo 😃
452: Key Encapsulation Mechanism API
Wprowadzenie do Javy standardowego API pozwalającego na użycie techniki znanej jako KEM, wykorzystywanej min. w algorytmach kryptografii kwantowej.
Materiały dodatkowe
- Deep dive into a post-quantum key encapsulation algorithm – artykuł od Cloudflare opisujący w przystępny sposób jak działa KEM.
Zainstaluj teraz i czytaj tylko dobre teksty!
Preview
430: String Templates (Preview)
Możliwość tworzenia w Javie bloków tekstu, dających dużo większe możliwości i bezpieczeństwo niż interpolacja stringów.
JSONObject doc = JSON_VALIDATE."""
{
"name": \{name},
"phone": \{phone},
"address": \{address}
};
""";
445: Unnamed Classes and Instance Main Methods (Preview)
Zmiana Launch Protocol w Javie, umożliwiająca pisania mocno uproszczonych klas Java, głównie na potrzeby edukacji.
void main() {
System.out.println("Hello, World!");
}
442: Foreign Function & Memory API (Third Preview)
Wprowadzenie typowanej interoperacyjności z programami napisanymi w C (a w przyszłości też innych języków kompilowanych), a także natywnej pamięci systemu operacyjnego.
443: Unnamed Patterns and Variables (Preview)
Wprowadzenie do języka wildcard _, używanego wtedy, gdy nie chcemy w pattern matchingu definiować konkretnej oczekiwanej wartości/typu, a także jako hint dla linterów, gdy wiemy że zadeklarowana zmienna jest niepotrzebna.
if(r instanceof Point(_, int y))
453: Structured Concurrency (Preview)
Zestaw struktur umożliwiających zarządzanie wątkami (nie tylko wirtualnymi), a zwłaszcza potencjalnymi błędami.
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
Supplier<String> user = scope.fork(() -> findUser());
Supplier<Integer> order = scope.fork(() ->fetchOrder());
scope.join().throwIfFailed();
return new Response(user.get(), order.get());
}
446: Scoped Values (Preview)
Alternatywa dla ThreadLocala
, zaprojektowana głównie z myślą o wirtualnych wątkach.
final static ScopedValue<...> V = ScopedValue.newInstance();
ScopedValue.where(V, <value>).run(() -> { V.get() });
Inkubacja
448: Vector API (Sixth Incubator)
Czekające na Valhalle API umożliwiające operacje wektorowe, udostępniane przez nowoczesne procesory.
Zainstaluj teraz i czytaj tylko dobre teksty!
A na koniec, trochę ogólnych linków
Wydanie nowej wersji JDK towarzyszył stream, który pozwolił na pocieszenie się z całą resztą community premierą:
Jedno z nich to świetne opracowanie ze strony kanału Inside Java, w którym Nicolai Parlog w 20 minutowym filmiku w szerszym stopniu opisuje każdy z JEP-ów:
Dodatkowo, ostatnimi tygodniami ukazała się na oficjalnym kanale Java cała seria filmików #RoadTo21, które prezentują kolejne nowości w nieco szerszym opracowaniu.
Nicolai opublikował też tekst Modern Java in Action, który pozwala zapoznać się z tym, jak te wszystkie nowe funkcjonalności można użyć na przykładzie realnej aplikacji.
A jeżeli potrzebujecie czegoś krótszego, „dla kolegi” który ma przestarzałą opinie o Javie, to dla mnie okazja, aby przemycić jeden z moich ulubionych kanałów programistycznych na YouTube. Jeśli cenicie sobie lekką, „memiczną” formułę opracowań, to Fireship zdecydowanie powinien przypaść Wam do gustu. Zawartość tego kanału to przede wszystkim krótkie, poniżej pięciominutowe filmy.
Autor skupia się na najistotniejszych tematach ze świata programowania. Dla mnie zawsze jest to fantastyczny sposób na śledzenie nowości z obszarów poza moją główną specjalizacją, jak na przykład nowe języki programowania czy innowacje typu bazy wektorowe.
Podkreślam to, ponieważ niedawno na kanale Fireship ukazało się video poświęcone JDK 21. Zachęcam do sprawdzenia, czy taki format odpowiada też Wam. Moim zdaniem, warto dać mu szansę:
A za tydzień porozmawiamy sobie o towarzyszących JDK 21 premierach: JavaFX oraz GraalVM, który też miał publiczny launch nowej wersji, zresztą pewnie w ciągu najbliższego tygodnia doczekamy się wysypu nowych możliwości języka. Zapis streamu znajdziecie poniżej: