Wybierz region
pl
  • PL
  • EN
Wydrukuj

Co nowego w Javie?

Zmiany w Javie, które dokonały się na przestrzeni ostatnich dwóch lat, tj. od ostatniej wersji LTS, widać, że praktycznie wszystkie skoncentrowane zostały w Javie 21. Zobaczmy co tam się wydarzyło :)

Niespełna dwa lata temu, z okazji wydania Javy 17, w jednym z artykułów udostępnianych na blogu przyjrzeliśmy się zmianom wprowadzonym w ostatnich wówczas wersjach tego języka. 19 września udostępniona została kolejna – po siedemnastce – wersja LTS (o długim czasie wsparcia), co stanie się dla nas okazją do ponownego przyjrzenia się ostatnim zmianom wprowadzonym w Javie. Nie będziemy szczegółowo omawiać wszystkich wprowadzonych na przestrzeni tych lat zmian. Przyjrzymy się jedynie tym szczególnie ciekawym czy istotnym z praktycznego punktu widzenia. 

Przegląd zmian od 18 do 20

Java 18 nie przyniosła spektakularnych zmian składniowych czy funkcjonalnych. Finalnej implementacji nie doczekał się w szczególności pattern patching w instrukcjach switch, o którym pisaliśmy w jednym z artykułów na blogu (zmiana ta pozostała jako preview). Nie oznacza to oczywiście, że żadnych ciekawych zmian nie było.  

Jedną z największych nowości w Javie 18 stało się określenie UTF-8 jako standardowego zestawu znaków dla interfejsów API Javy. Dzięki temu elementy interfejsu zależne od domyślnego zestawu znaków będą działać wspólnie we wszystkich implantacjach, systemach operacyjnych, ustawieniach regionalnych czy konfiguracjach. Wybór UTF-8 był w tym przypadku oczywisty, jako że od dawna jest on najpopularniejszym zestawem znaków w Internecie. Wykorzystywany jest on m.in. przez pliki XML oraz JSON, które w bardzo szerokim zakresie przetwarzane są właśnie przez programy pisane w Javie. W konsekwencji sensowne było określenie UTF-8 jako domyślnego zestawu znaków dla wszystkich interfejsów API Java.  

Wśród innych rozwiązań, które pojawiły się w 18 wersji języka wymienić można wprowadzenie lekkiego serwera http dostępnego out of the box (Simple Web Server) czy wprowadzenie tagu @snippet umożliwiającego łatwiejsze wprowadzanie przykładowych snipppetów kodu źródłowego do dokumentacji.  

W Javie 19 ponownie najciekawsze zmiany pozostawione zostały w wersji preview. Jako przykłady wskazać można Record Patterns, wątki wirtualne czy wspomniany wcześniej pattern patching w instrukcjach switch (w tym przypadku już trzeci preview). Wersja ta nie przyniosła w zasadzie żadnych finalnych implementacji zmian, pozostawiła jednak użytkowników z kilkoma naprawdę interesującymi perspektywami rozwojowymi. 

Podobna sytuacja miała miejsce w przypadku Javy 20. Wersja ta nie wprowadziła żadnych ostatecznych zmian do języka, zawierała natomiast kilka interesujących propozycji w statusie preview lub incubator. Były to zmiany wymienione już w poprzednim akapicie, a dodatkowo tzw. Scoped Values, umożliwiające bezpieczne współdzielenie danych w obrębie wątków i między nimi. 

O Java 21

19 września 2023 roku wydana została 21 wersja języka. Wydana została jako tzw. LTS, a zatem wersja o długim czasie wsparcia, chętniej niż inne wybierana przez twórców oprogramowania. Można było spodziewać się, że wiele interesujących zmian, które rozwijane były w poprzednich wersjach doczeka się finalnej implementacji. I tak też się stało.  

Ostatecznej implementacji doczekał się wspomniany wcześniej i opisany już na blogu pattern matching dla instrukcji switch. Krótko przypominając, pozwala on dopasowywać obiekty przekazywane do tej instrukcji sterującej do określonego wzorca, podczas gdy we wcześniejszej wersjach Javy możliwe było jedynie dokonywanie porównań wartości kilku podstawowych typów. Od Javy 21 poprawny będzie zatem np. taki zapis: 

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();

 

};

 

}

Kolejną zmianą, która przybrała ostateczną formę w Javie 21 są Record Patterns. Zmiana ta może być szczególnie przydatna w połączeniu z wprowadzonym już wcześniej ulepszonym instanceof (brak konieczności jawnego rzutowania, jeśli okaże się, że obiekt w istocie jest instancją danej klasy). W konsekwencji od Javy 21 możliwy jest taki, uproszczony zapis: 

static void printSum(Object obj) { 

 

if (obj instanceof Point(int x, int y)) {

 

System.out.println(x+y);

 

}

 

}

podczas gdy dotychczas musieliśmy rozpisywać taką sytuację jako: 

static void printSum(Object obj) { 

 

if (obj instanceof Point p) {

 

int x = p.x();

 

int y = p.y();

 

System.out.println(x+y);

 

}

 

}

W ramach 21 wersji języka wprowadzono także wątki wirtualne (Virtual Threads). Wątki takie nie są powiązane z wątkami systemowymi, co czyni całe API lżejszym i bardziej elastycznym.  

Ostatnią finalną zmianą, o której warto wspomnieć prezentując Javę 21 są tzw. kolekcje uporządkowane (Sequenced Collections). We wcześniejszych wersjach języka brak było typu (nadrzędnego interfejsu) w ramach kolekcji, który reprezentowałby sekwencję elementów ze zdefiniowaną kolejnością. W konsekwencji brak było również jednolitego zestawu operacji, które mają zastosowanie do takich kolekcji. Dla zobrazowania problemu spójrzmy na tabelę, w której zaprezentowano metodę pobrania pierwszego oraz ostatniego elementu przez wybrane interfejsy lub implementacje: 

 

Jako rozwiązanie zdefiniowano nowe interfejsy dla kolekcji, zbiorów i map, a następnie dopasowano je do istniejącej hierarchii typów kolekcji.  

Obecna struktura kolekcji prezentuje się w konsekwencji następująco (na zielono zaznaczono wprowadzone nowe elementy „uporządkowujące”): 

 

Podsumowując

Zmiany w Javie, które dokonały się na przestrzeni ostatnich dwóch lat, tj. od ostatniej wersji LTS, widać, że praktycznie wszystkie skoncentrowane zostały w Javie 21. Wersje 18, 19 i 20 pozwoliły społeczności Javy rozwinąć kilka naprawdę interesujących funkcjonalności, które ostatecznie znalazły się w 21 wersji języka jako finalna implementacja. Zmiany te będą zapewne wymagały od programistów przyzwyczajenia się, jednak z czasem na pewno uczynią pisanie programów w Javie łatwiejszym i przyjemniejszym.   

Przykłady podane za openjdk.org.


Michał Karmelita

Z wykształcenia prawnik i informatyk. Zawodowo i z zamiłowania programista Java. W wolnym czasie stara się oddawać przyjemnościom i unikać przykrości. Zapalony podróżnik.


Wydrukuj