Dzisiaj po raz pierwszy przyglądniemy się tematowi tego, co przyniesie następne duże wydanie JDK 21. Oprócz tego kilka ciekawych materiałów o JFR i Release Radar.
1. Pierwsze informacje na temat JDK 21
Gdy wszyscy powoli oczekujemy już rychło zbliżającej się premiery JDK 20, w tle powoli klaruje się też lista funkcjonalności, które trafią już tej jesieni do JDK 21.
Zacznijmy od JEP-ów, które już teraz oficjalnie zostały zaproponowane jako część jesiennego wydania. Wszystko wskazuje więc na to, że doczekamy się tam wersji testowej String Templates. Ich celem ma być rozszerzenie Text Blocks, wprowadzonych w JDK 15. String Templates ułatwiają wypełnianie ich (ale także zwykłych Stringów) dynamicznymi wartościami.
Żeby lepiej zwizualizować, jeden z przykładów z JEP-a:
String name = "Joan Smith";
String phone = "555-123-4567";
String address = "1 Maple Drive, Anytown";
String json = STR."""
{
"name": "\{name}",
"phone": "\{phone}",
"address": "\{address}"
}
""";
Możliwe jest także wykonywanie całych wyrażeń:
<code> int x = 10;
int y = 20;
String s = STR."\{x} + \{y} = \{x + y}"; // 10 + 20 = 30
Całość opiera się na tak zwanych procesorach, w powyższych przykładach używany był STR.
, który po prostu wykonuje interpolacje. Sam JDK wprowadza również procesor FMT.
, umożliwiający dodatkowe procesowani odpowiedzi, jak np. definiowanie dokładności float
po przecinku. Użytkownik będzie miał możliwość definiowania również własnych formaterów. Powstały mechanizm wygląda na naprawdę elastyczny i wychodzący daleko poza proste uzupełnianie stringa zmiennymi.
Kolejnym już zapowiedzianym dodatkiem jest JEP 431: Sequenced Collections. Do tej pory brakowało w JDK interfejsu, który mógłby definiować kolekcje o elementach w jasno zdefiniowanej kolejności, równocześnie umożliwiając łatwe iterowanie po nich. Z tego powodu w zasadzie każda z istniejących kolekcji podchodziła do tematu inaczej:
Dlatego też do JDK trafi nowy interfejs, oparty o implementację Deque:
<code>interface SequencedCollection<E> extends Collection<E> {
SequencedCollection<E> reversed();
void addFirst(E);
void addLast(E);
E getFirst();
E getLast();
E removeFirst();
E removeLast();
}
Oprócz lepszego wsparcia dla operacji na pierwszym i ostatnim elemencie, ułatwione będzie również iterowanie po kolekcji w odwrotnej kolejności dzięki wprowadzeniu metody reversed()
.
To jednak nie wszystko – wszystko wskazuje na to, że w JDK 21 doczekamy się również dwóch kolejnych JEP-ów – Record Patterns oraz Pattern Matching for switch. Jak zauważył Reddit /r/java, mimo że oba JEPy pozostają jeszcze w Drafcie, to przykłady kodu jasno odnoszą się w nich właśnie do JDK 21. Wydaje się więc, że jesień będzie należała do Projektu Amber.
A jak już jesteśmy przy Pattern Matchingu i dekonstrukcji rekordów – twórcy JDK nie planują się na tym zatrzymać. W zeszłym tygodniu Brian Goetz opublikował analizę Deconstruction patterns dotyczącą możliwości zaimplementowania dekonstrukcji innych obiektów, niż tylko rekordy. W tym dokumencie zaproponowano wprowadzenie Dekonstruktorów, które są uogólnieniem rozwiązań stworzonych na potrzeby rekordów. Pozwalać mają one na destrukturyzację dowolnej klasy, która ma je zadeklarowane – dekonstruktory muszą być zdefiniowane jawnie i wymagają exact-matchu.
Poniższy przykład pokazuje, jak mogłyby wyglądać, aczkolwiek Brian Goetz zastrzega, że składania jest wyłącznie poglądowa i nie należy się do niej przyzwyczajać.
class Point {
final double x, y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public matcher Point(double x, double y) {
x = this.x;
y = this.y;
}
}
Stanowić więc mają coś w rodzaju odwrotności konstruktorów – mają bowiem zbierać wartości pól danego obiektu i wystawiać je jako możliwe do łatwego wyekstrachowana z klasy.
Tak na sam koniec warto też wspomnieć, że JDK 21 będzie wydaniem LTS (Long-Time Support). Zatem miejmy nadzieje, że będzie jak najbardziej wypełnione funkcjonalnościami – to właśnie ono bowiem będzie na lata wydaniem sugerowanym produkcyjnemu użyciu.
Źródła
- JEP 430: String Templates (Preview)
- JEP Draft: Record Patterns
- JEP Draft: Pattern Matching for switch
- JEP 431: Sequenced Collections
- Deconstruction patterns
Zainstaluj teraz i czytaj tylko dobre teksty!
2. Do czego się może przydać JDK Flight Recorder
JDK Flight Recorder (oficjalna aplikacja do monitoringu JVM) przez długi czas “latał pod radarem” większość programistów JVM, co było związane z faktem, że wymagał komercyjnej wersji JDK udostępnianej przez Oracle. Choć zdarzały się oczywiście firmy, które takową posiadały, to jednak mocno wpływało to zarówno na poziom umiejętności programistów (przez kiepską dostępność trudno było nauczyć się obsługi tego narzędzia), jak i zainteresowanie do inwestowania w jego poznanie (zbyt prawdopodobnym było, że kolejna firma, w której będziemy pracować, nie będzie miała do niego dostępu). Teraz jednak, kiedy już nareszcie wraz z JDK 11 całość trafiła w ręce społeczności i można mówić, że wreszcie następuje mały, powolny renesans.
Ostatnio na blogu inside.java pojawił się bowiem zapis prezentacji Joakima Nordström z Oracle, która stanowi bardzo praktyczne wprowadzenie do tego, w jakich sytuacjach przydać może się programistom Flight Recorder. Całość skupia się na API JFR i jego podstawowych składowych, takich jak dostępne ustawienia, zdarzenia, rodzaje dostępnych informacji i metadane i metadane. W przeciągu niecałych 40 minut Joakim pokaże Wam więc wystarczająco dużo, aby podjąć decyzje czy JFR również w Waszej aplikacji.
JFR ma zresztą też swoich małych bohaterów poza Oraclem i jeśli powyższa prezentacja zachęci Was do spróbowania tego narzędzia, to najlepszą osobą do śledzenia będzie Gunnar Morling. Wyobrażacie sobie na przykład, że taki format pliku wynikowego Flight Recordera nie jest w żaden sposób udokumentowany? To właśnie Gunnar na podstawie kodu źródłowego przygotował pełną specyfikację tego, w jaki sposób Flight Recorder działa, wraz z bardzo dokładnym diagramem, który teraz pozwolić może na stworzenie alternatyw do oryginalnych narzędzi Oracle, a także integracje całości z całym ekosystemem tooli do monitoringu.
Blog Gunnara pełny jest świetnych publikacji pokazujących, jak potężnym narzędziem jest Flight Recorder, jak choćby stosunkowo świeży tekst Finding Java Thread Leaks With JDK Flight Recorder and a Bit Of SQL czy nieco wcześniejszy Is your Blocking Queue… Blocking?. Dość powiedzieć, że to właśnie jego publikacje zainteresowały mnie narzędziem, którego wcześniej nie dotknąłbym pewnie kijem – polecam serdecznie.
Źródła
- Finding Java Thread Leaks With JDK Flight Recorder and a Bit Of SQL
- Is your Blocking Queue… Blocking?
Zainstaluj teraz i czytaj tylko dobre teksty!
3. Release Radar
Maven 3.9.0
Choć kolejne wersje Mavena przechodzą ostatnimi czasy nieco bez echa, to to wciąż bardzo popularne narzędzie do budowania aplikacji w dalszym ciągu się rozwija i podąża za trendami. Niedawno ukazał się Maven 3.9.0, który stanowi ważny krok w rozwoju projektu – porzucił on wsparcie dla (dużo) starszych wersji JDK i wymaga teraz Javy 8. Twórcy chwalą się, że ten ruch pozwolił im na zaktualizowanie kilka kluczowych zależności, min. Guice czy Maven Resolver. Oprócz tego, pojawiło się też kilka poprawek błędów i ulepszeń – pełną listę znajdziecie tutaj.
Twórcy ostrzegają, że aktualizacja ta może powodować problemy dla niektórych wtyczek ze względu na zmiany w sposobie obsługi zależności. W szczególności jest to wspomniany już Maven Resolver, co sprawia, że niektóre wtyczki mogą potrzebować zadeklarować zależność od konkretnej wersji plexus-utils
.
Apache NetBeans 17
Ktoś używa jeszcze NetBeans? Jeśli tak, to niedawno pojawiła się pojawiła się nowa wersja tego edytora.
Lista zmian jest naprawdę długa, ale brakuje na niej czegoś, co mogłoby zainteresować w takim stopniu, jak np. gro nowości w każdej nowej wersji Intellij, a najciekawszym aspektem całego wydania jest chyba to, że NetBeans wciąż jest rozwijany. Jeśli miałbym wskazać największe z mojej perspektywy zmiany, to do takich bardziej przyciągających oczy z pewnością można zaliczyć wsparcie dla Jakarta EE 10 oraz PHP 8.2.
jOOQ 3.18
jOOQ 3.18 został wydany z kilkoma ulepszeniami. Jednym z kluczowych dodatków jest ulepszony DiagnosticsListener, który zapewnia dodatkową diagnostykę dla zapytań SQL i nowe transformacje wzorców. Dodatkowo, jOOQ 3.18 dodaje obsługę kilku – specyficznych dla dostawców – przydatnych rozszerzeń SQL/JSON, więcej implementacji wprowadzonego w jOOQ 3.16 Query Object Model (QOM) API, obsługę tablic asocjacyjnych Oracle oraz kilka usprawnień dla jooq-kotlin
, które umożliwiają bardziej idiomatyczne.
Na sam koniec warto wspomnieć, że ucieszyć się powinni fani programowania reaktywnego – wydanie to aktualizuje również wersję R2DBC (reaktywnego sterownika baz danych) do wersji 1.0.