Sytuacja kobiet w IT w 2024 roku
17.09.20193 min
Adam Kukołowicz

Adam KukołowiczCo-founderBulldogjob

Java 13 - co nowego?

Przeczytaj o 5 nowościach, które przynosi Java 13. Zobacz jak zapisać wieloliniowe bloki tekstu, jakich zmian doczekał się switch oraz jak nowa wersja pomoże przyspieszyć aplikacje.

Java 13 - co nowego?

Java 13 weszła w fazę General Availability, a więc jest gotowa do instalowania na produkcji. A może nie warto się tak śpieszyć? Przekonajmy się.

Jest to kolejne krótko żyjące wydanie, już za pół roku zastąpi je Java 14. Do nowego wydania weszło raptem 5 JEP-ów (JDK Enhancement Proposal). Dodatkowo 3 z nich to ulepszenia mechanizmów wprowadzonych w poprzednich wersjach.

Bloki tekstu

Zupełną nowością jest wprowadzenie w Javie bloków tekstu (JEP-355). Bloki tekstu to nic innego jak wieloliniowe literały. Będą one ograniczone znakami """. Dzięki nowej składni, zamiast pisać:

"line 1\nline 2\nline 3\n"


Lub

"line 1\n" +
"line 2\n" +
"line 3\n"


Można będzie napisać:

"""
line 1
line 2
line 3
"""


Oczywiście wprowadza to kilka drobnych problemów z kontrolowaniem \n na końcu i kontrolowaniem wcięcia w tego rodzaju blokach. Przykład? Proszę:


Wynikiem:

String html = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
""";


Będzie:

              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>


Natomiast:

String html = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
                  """;


Wyrzuci:

<html>
    <body>
        <p>Hello, world</p>
    </body>
</html>


Wygląda jak coś, co programiści będą google’ować, dopóki nie wejdzie w krew. By użyć tej opcji trzeba użyć przełącznika --enable-preview.

Poprawiony switch, yield zamiast break

Drugą zmianą składni jest dopracowanie wyrażenia switch (JEP 354). Zostało ono wprowadzone jako jedna z funkcji “preview” w Javie 12, o czym pisałem pół roku temu. Z poprzedniego artykułu dowiecie się też więcej o samej składni wyrażenia switch. Nowa propozycja zmienia tylko jeden aspekt. W Javie 12 możliwe było użycie wieloliniowego bloku wewnątrz switcha:

int j = switch (day) {
    case MONDAY  -> 0;
    case TUESDAY -> 1;
    default      -> {
        int k = day.toString().length();
        int result = f(k);
        break result;
    }
};


Jak widzimy, by przypisać wartość do warunku default konieczne było użycie break, teraz zostało to zastąpione słowem kluczowym yield, więc w Javie 13 ten sam przykład będzie wyglądać tak:

int j = switch (day) {
    case MONDAY  -> 0;
    case TUESDAY -> 1;
    default      -> {
        int k = day.toString().length();
        int result = f(k);
        yield result;
    }
};

AppCDS, ZGC i implementacja socketów

Java 13 umożliwi tworzenie dynamicznych archiwów class-data sharing (JEP 350). Jest to tak naprawdę rozszerzenie funkcji application class-data sharing. Nowa implementacja umożliwia archiwizację klas podczas wyłączania aplikacji. W archiwum znajdą się wszystkie klasy aplikacji i biblioteki, które zostały załadowane, a których nie ma w podstawowym CDS (które jest włączone domyślnie od Javy 12). To wszystko by jeszcze bardziej przyspieszyć start aplikacji napisanych w Javie. Do tej pory application class-data sharing wymagał zrobienia kilku próbnych uruchomień, zrzucenia archiwum, a następnie uruchomienia go. Nowa implementacja pozwoli na pominięcie pierwszego kroku.

Przepisania doczekało się niskopoziomowe API do socketów, z którego korzystają java.net.Socket i java.net.ServerSocket. Poprzednia implementacja pamiętała czasy JDK 1.0 i była mieszanką Javy i C. Oprócz tego, że ciężko było ten kod utrzymywać, to powodował spore problemy, gdy używało się go razem z fibers.

Ostatnią zmianą jest spore ulepszenie ZGC - garbage collectora wprowadzonego w Javie 11. Co prawda ZGC jest bardzo szybki, ma jednak jedną poważną wadę - nie umie zwracać pamięci do systemu operacyjnego. To w większości zastosowań jest niedopuszczalne. Właśnie wprowadzony JEP 351 rozwiązuje ten problem. Dzięki temu ZGC ma potencjał na bycie użytecznym dla znacznie większej liczby użytkowników.

Zbyt szybki cykl?

Kolejne wydanie co 6 miesięcy to bardzo szybkie tempo. Na tyle szybkie, że naprawdę niewielka część zespołów postawi na migrację. W wersjach między LTS-ami nie pojawia się zbyt wiele znaczących nowości. Wiele funkcji jest eksperymentalnych i wersje takie jak 12 czy 13 to pole doświadczalne dla twórców języka. Dwa lata po wprowadzeniu nowego cyklu wydawania Javy można powiedzieć, że lwią większość programistów tego języka będą interesować tylko wydania LTS.

A tymczasem większość developerów i tak używa w dalszym ciągu Javy 8. Chyba nie ma w tym nic złego, skoro dalej działa, jest przetestowana w bojach, ma jako takie wsparcie i większość współczesnych funkcji.

<p>Loading...</p>