Java 13 już we wrześniu

Czas szybko płynie. Ledwo był marzec, w którym opisywaliśmy Javę 12, a tu już mamy wrzesień i nadchodzącą wielkimi krokami Javę 13. Pytanie zasadnicze brzmi (jak zawsze) - jaka jest lista nowości/zmian w nowej wersji? Odpowiemy na to pytanie w kilku najbliższych akapitach.

Java 13 - 17 Września 2019

  • Switch Expressions - Wyrażenia te pojawiły się już co prawda w wersji dwunastej, ale w trzynastce nadal jest to funkcjonalność eksperymentalna. Obecnie wprowadzono nowe słowo kluczowe - yield, które zastępuje dotychczas używanego break-a. Pamiętajmy jednak, że dotyczy to wyrażenia switch (zwracającego wartość), a nie instrukcji switch (tej używanej od dawna w Javie i nie zwracającej wartości).

    Tak więc zamiast dotychczasowego zapisu możemy osiągnąć ten sam rezultat stosując nowy zapis:
    int j = switch (day) {
        case MONDAY  -> 0;
        case TUESDAY -> 1;
        default      -> {
            int k = day.toString().length();
            int result = f(k);
            break result;
        }
    };
    
    int j = switch (day) {
        case MONDAY  -> 0;
        case TUESDAY -> 1;
        default      -> {
            int k = day.toString().length();
            int result = f(k);
            yield result;
        }
    };
    
    Możemy też użyć konstrukcji blokowej w postaci:
    int result = switch (s) {
        case "Foo": 
            yield 1;
        case "Bar":
            yield 2;
        default:
            System.out.println("Neither Foo nor Bar, hmmm...");
            yield 0;
    };     
    
  • Text Blocks - Bloki tekstowe to coś na co czekamy z niecierpliwością. Niestety występują one również jako funkcjonalność eksperymentalna. Niemniej daje to nadzieje, że być może już niedługo trafią do powszechnego użycia. Na czym polegają bloki tekstowe? A więc taki blok to nic innego jak wieloliniowy ciąg znaków, którego nie musimy rozdzielać znakami specjalnymi po zakończeniu każdej z linii. Do tej pory coś takiego funkcjonowało już w innych językach, na przykład w Pythonie.

    Szczególnie przydatne jest to w kontekście użycia HTML-a lub SQL-a w pliku java. Dla przykładu, w przypadku HTML-a, zamiast używać przestarzałej konstrukcji możemy osiągnąć ten sam rezultat stosując nowy, dużo czytelniejszy zapis:
    String html = "<html>\n" +
                  "    <body>\n" +
                  "        <p>Hello, world</p>\n" +
                  "    </body>\n" +
                  "</html>\n";
    
    String html = """
                  <html>
                     <body>
                          <p>Hello, world</p>
                      </body>
                  </html>
                  """;
    
    W przypadky SQL-a wygląda to analogicznie:
    "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`\n" +
    "WHERE `CITY` = 'INDIANAPOLIS'\n" +
    "ORDER BY `EMP_ID`, `LAST_NAME`;\n";
    
    """
    SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
    WHERE `CITY` = 'INDIANAPOLIS'
    ORDER BY `EMP_ID`, `LAST_NAME`;
    """
    
  • Reimplement the Legacy Socket API - Zastąpienie implementacji dostarczanej przez interfejsy java.net.Socket i java.net.ServerSocket prostszą i bardziej nowoczesną implementacją, która jest przy okazji łatwiejsza w debugowaniu.
  • Dynamic CDS Archives - Dalsze prace usprawniające mechanizm współdzielenia danych klas w aplikacji (o domyślnym trybie wspominaliśmy podczas opisu Javy 12). Obecnie chodzi o ty, by umożliwić dynamiczną archiwizację klas po zakończeniu wykonywania aplikacji Java.
  • ZGC: Uncommit Unused Memory - Ulepszenie garbage collectora ZGC (znanego również pod nazwą The Z Garbage Collector), polegające na stworzeniu skalowalnego pojemnika o niskim opóźnieniu, zdolnego do obsługi heapów (przestrzeni do alokacji pamięci podczas uruchamiania) o dużej wielkości - od kilku gigabajtów do wielu terabajtów. Przy tym proces nie powinien zajmować więcej niż 10ms.

    ZGC obecnie nie zwraca pamięci do systemu operacyjnego, nawet jeśli pamięć ta była nieużywana przez długi czas. To zachowanie nie jest optymalne dla wszystkich typów aplikacji i środowisk, ale szczególnie dla tych, w których kluczowe jest zużycie pamięci (na przykład środowiska kontenerowe opłacane według użycia zasobów).

    Dodatkową motywacją do wdrożenia tego udoskonalenia było to, że zarówno garbage collector G1 jak i Shenandoah zapewniały tę funkcjonalność już nieco wcześniej.
Biorąc pod uwagę to, że jedyne stricte programistyczne funkcjonalności są dostępne w wersji eksperymentalnej, a reszta to mechanizmy raczej wewnętrzne, można stwierdzić, że nowa wersja Javy dla wielu pozostanie raczej zwykłą ciekawostką. Pewien wyjątek stanowi jedynie kwestia socketów. Tutaj, jeśli ktoś chciałby oprogramować gniazda w prostszy i bardziej elegancki sposób, to przejście na Javę 13 wydaje się być dobrym pomysłem. Tak samo sprawa wygląda w przypadku, gdy zależy nam na podniesieniu wydajności działania odśmieczacza pamięci ZGC.
Autor: Jarek Klimas
Data: 30 sierpnia 2019
Labele:Backend, Poziom podstawowy, Java Linki:
https://openjdk.java.net/projects/jdk/13
https://openjdk.java.net/projects/zgc
Masz swoje przemyślenia na temat artykułu? Podziel się nimi!
Masz pytanie odnośnie zagadnienia omawianego w artykule?
Coś, co napisaliśmy, nie zaspokoiło Twojego głodu wiedzy?
Daj nam znać co myślisz i skomentuj artykuł na facebooku!

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE