Java 13 – nowe funkcjonalności sczęśliwej trzynastki

17 września pojawiła się nowa wersja Javy oznaczona numerkiem 13. Mam nadzieję, że nie będzie to pechowa wersja i będzie działać jak trzeba. Java 13 wprowadza kilka nowych funkcjonalności. Poniżej możesz znaleźć listę JEPów (Java Enhancement Proposal) wprowadzonych w nowym wydaniu wraz z odnośnikami do oryginalnych opisów.

Bloki tekstu (JEP 355)

Zacznę opisywanie od końca listy. W nowej wersji Javy doczekaliśmy się bloków tekstu, które mogę być znane z innych języków jak chociażby Python. Jest to dopiero preview – czyli w pełni wyspecyfikowana funkcjonalność, w pełni zaimplementowana ale jeszcze nie stała. Dopiero po informacji zwrotnej od developerów którzy jej używają, wejdzie ona (możliwe, że po poprawkach) do kolejnego wydania.

Czym są te bloki tekstu? To nic innego jak wielolinijkowe łańcuchy znaków (Stringi) które można zawrzeć w bloku, bez dodatkowych sekwencji ucieczki (escape sequence). Najprościej chyba będzie to pokazać na przykładzie kodu.

String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
view raw text-blocks.java hosted with ❤ by GitHub

Jak możemy zobaczyć na przykładzie, blok tekstu tworzymy poprzez ujęcie go w potrójny cudzysłów. Spacje na początku tekstu zostaną obcięte do dolnych cudzysłowów lub do najbardziej wysuniętego na lewo elementu.

Zapewne widzisz już teraz wiele miejsc gdzie zastosowanie funkcjonalności z Javy 13 uprościło by tworzony przez Ciebie kod 🙂

Funkcjonalność ta jest dość rozległa i została opisana szerzej w oddzielnym artykule na blogu: https://blog.mloza.pl/text-blocks-java-13-czyli-bloki-tekstu-w-kodzie/

Switch expressions (JEP 354)

Ta funkcjonalność była dostępna już jako preview w Javie 12, jednak zdecydowano się wprowadzić jeszcze kilka poprawek i pozostawić je w tym stanie w Javie 13. Teraz będziemy mogli zwracać wartość ze switchy i przypisywać ja bezpośrednio do zmiennych. Została wprowadzona też składnia używająca strzałek (->) zamiast dwukropków. Strzałki nie mają jednak zastąpić dwukropków. W przypadku użycia nowej składni, switch nie będzie przechodził automatycznie do kolejnych przypadków (fall through) możemy więc budować switche bez użycia break. Zobaczmy przykład, najpierw zapis w starej składni:

switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
System.out.println(6);
break;
case TUESDAY:
System.out.println(7);
break;
case THURSDAY:
case SATURDAY:
System.out.println(8);
break;
case WEDNESDAY:
System.out.println(9);
break;
}
view raw old-switch.java hosted with ❤ by GitHub

A teraz równoważny kod używający nowej składni switch ze strzałkami:

switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
view raw new-switch.java hosted with ❤ by GitHub

Możecie również zauważyć, że w nowej składni możemy podać kilka wartości w jednym case.

Kolejną rzeczą o której już wspomniałem, jest zwracanie wartości ze switcha. Obrazuje to kolejny przykład:

int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
view raw new-switch-2.java hosted with ❤ by GitHub

Możemy to porównać do kodu który musielibyśmy napisać używając starej składni:

int numLetters;
switch (day) {
case MONDAY:
case FRIDAY:
case SUNDAY:
numLetters = 6;
break;
case TUESDAY:
numLetters = 7;
break;
case THURSDAY:
case SATURDAY:
numLetters = 8;
break;
case WEDNESDAY:
numLetters = 9;
break;
default:
throw new IllegalStateException("Wat: " + day);
}
view raw old-switch-2.java hosted with ❤ by GitHub

Od razu widać, że kod jest bardziej czytelny i zwięzły, czyli mniej podatny na błędy.

Tą funkcjonalność opisałem w oddzielnym poście, gdzie pokazuję wszystkie nowości na przykładach. Możecie ją znaleźć tutaj: Switch expressions w Java 13 – nowa składnia switchy.

ZGC: Zwracanie nieużywanej pamięci do systemu (JEP 351)

Pierwsza wersja Z Garbage Collector pojawiła się w Javie 11. Od tamtej pory w każdym wydaniu dostaje nowe moce. Do tego momentu ZGC nie zwracał nieużywanej pamięci do systemu, nawet jeśli była ona wolna bardzo długo. Jest to problem w środowiskach gdzie ilość zajmowanej pamięci przez program jest ważna (np. kontenery gdzie płacimy za zużycie zasobów, maszyny na których uruchomione jest wiele aplikacji rywalizujących o pamięć, program który nic nie robi przed większość czasu nie powinien trzymać wolnej pamięci z której mogłyby korzystać inne aplikacje).

Nowe Socket API (JEP 353)

Oryginalna implementacja Socket API jest bardzo stara i sięga czasów Javy 1.0. Jest to mix starego kodu Javowego oraz natywnego kodu w C które są trudne w utrzymywaniu i debugowaniu. Dodatkowo, kod ten nie jest gotowy do współpracy z lekkimi wątkami które są opracowywane w ramach projekt Loom. Pomimo, że Java zawiera nową implementację w pakiecie java.nio to wciąż dużo aplikacji korzysta ze starej wersji. Przepisany kod dzieli implementację z nową wersją (NIO) więc nie potrzebuje używać natywnego kodu. Używa również locków z java.util.concurrent zamiast metod synchronizowanych i locków w natywnym kodzie więc będzie dobrze współpracował z włóknami (fibers).

Dynamiczne archiwa CDS (JEP 350)

Funkcjonalność ta jest rozwinięciem pomysłu na dzielenie danych klas pomiędzy wirtualnymi maszynami oraz pomiędzy uruchomieniami VM (JEP 310). Celem tego jest zmniejszenie ilości potrzebnej pamięci (jeśli dzielimy dane pomiędzy VM) oraz skrócenie czasu startu aplikacji. Funkcjonalność ta istnieje od Javy 5, jednak jest trudna w użyciu i wymaga dodatkowych kroków aby stworzyć takie archiwum, które później może nam pomóc. Nowe wydanie Javy znacznie upraszcza pracę z archiwami CDS, możemy stworzyć takie archiwum automatycznie podczas wyjścia z aplikacji.

Podsumowanie

Nowe funkcjonalności wprowadzone w 13 wersji Javy wyglądają bardzo ciekawie. Szczególnie składnia Switch oraz bloki tekstu. Na pewno uprości to kod wielu aplikacji a co za tym idzie będą one mniej podatne na błędy. Szkoda tylko, że wciąż to jest preview i musimy jeszcze poczekać, aż będzie można oficjalnie z tego korzystać.

Na temat Switch expressions i bloków tekstu pojawią się oddzielne artykuły z wieloma przykładami i szerszym opisem możliwości.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *