Kurs Java

Premiera Javy 19

Kolejny raz Java pojawia się w nowej odsłonie we wrześniu. Tym razem premiera Javy 19 GA nastąpiła 20 września. Zobaczmy, co ciekawego znalazło się w ostatniej wersji naszego ulubionego języka.

Java 19 - 20 września 2022

  • W Javie 19 pojawiła się jedna z ciekawszych zmian istotnych w kontekście pracy dewelopera, co nie zostało specjalnie zaanonsowane w liście zmian wprowadzonych w tej wersji Javy. Zmiana dotyczy inicjalizacji haszmapy. O co chodzi? Otóż zawsze byliśmy w stanie wygenerować HashMap w następujący sposób:
    Map<String, Integer> map = new HashMap<>(120);
    
    Intuicyjnie można pomyśleć, że taka inicjalizacja pozwoli stworzyć 120 mapowań, co jednak...nie jest prawdą! Dzieje się tak, ponieważ haszmapa jest inicjowana z domyślnym współczynnikiem obciążenia 0,75. Oznacza to, że jak tylko haszmapa jest zapełniona w 75%, jest ona przebudowywana ("odświeżana") z dwukrotnie większym rozmiarem. Gwarantuje to, że elementy są rozmieszczone tak równomiernie, jak to możliwe, oraz że jak najmniej wiader (popularne buckets) haszmapy zawiera więcej niż jeden element.

    W ten sposób haszmapa o pojemności 120 może pomieścić tylko 120 x 0,75 = 90 mapowań. I teraz, aby utworzyć haszmapę dla realnych 120 mapowań, do tej pory trzeba było obliczyć pojemność, dzieląc liczbę mapowań przez współczynnik obciążenia:
    120 ÷ 0,75 = 160.
    Map<String, Integer> map = new HashMap<>(160);
    
    W Javie 19 możemy stworzyć mapę od razu z uwzglęnieniem współczynnika obciążenia, ponieważ przeliczenie wykonuje za nas metoda newHashMap dostarczona razem z Javą.
    Map<String, Integer> map = HashMap.newHashMap(120);
    
    To co się dzieje w ramach tej metody, wygląda następująco:
    public static <K, V> HashMap<K, V> newHashMap(int numMappings) {
        return new HashMap<>(calculateHashMapCapacity(numMappings));
    }
    
    static final float DEFAULT_LOAD_FACTOR = 0.75f;
    
    static int calculateHashMapCapacity(int numMappings) {
        return (int) Math.ceil(numMappings / (double) DEFAULT_LOAD_FACTOR);
    }
    
  • Pattern Matching for switch [preview]

    W Javie 19 zostaje wprowadzona kolejna część zmian z cyklu obsługi dopasowania zmiennych do wzorca, czyli tzw. Pattern Matching. W przypadku switch-a pierwsze zmiany pojawiły się w Javie 17. Zachęcamy do przyjrzenia się, na czym polega to rozwiązanie w artykule Co nowego w Javie 17.

    W najnowszej wersji Javy dodane zostały jedynie drobne usprawnienia. Konkretnie została zmieniona składnia Guarded Pattern. Na przykład zamiast warunku String text && text.length() > 10 używamy teraz słowa kluczowego when, czyli zamiast:
    switch (someObject) {
        case String text && text.length() > 5 -> System.out.println(text.toUpperCase());
        case String text                      -> System.out.println(text.toLowerCase());
    
        case Integer value                    -> System.out.println(value * value);
    
        default -> {}
    }
    
    napiszemy teraz:
    switch (someObject) {
        case String text when text.length() > 10 -> System.out.println(text.toUpperCase());
        case String text                        -> System.out.println(text.toLowerCase());
    
        case Integer value                      -> System.out.println(value * value);
    
        default -> {}
    }
    
  • Record Patterns [preview]

    Wzorce dopasowania pojawiały się już wcześniej (przed Javą 17) i były omawiane w kontekście na przykład operatora instanceof. W Javie 19 mamy wprowadzone wzorce dla rekordów, a więc możemy teraz (w trybie preview) wykorzystać rekord razem z operatorem instanceof. Innymi słowy mając na przykład rekord Point, jesteśmy w stanie sprawdzić, czy dany obiekt jest typu Point w ten sposób:
    // Rekord
    public record Point(int x, int y) {}
    
    // Dopasowanie wzorca w ramach instanceof
    private void doSomething(Object someObject) {
        if (someObject instanceof Point(int x, int y)) {
            System.out.println("someObject exists at point, x = " + x + ", y = " + y);
        }
        ...
    }
    
    Zobaczmy jeszcze, jak to będzie wyglądać w kontekście wyrażenia switch:
    // Rekord
    public record Point(int x, int y) {}
    
    // Dopasowanie wzorca w ramach wyrażenia switch
    private void doSomething(Object someObject) {
        switch (someObject) {
            case Point(int x, int y)
                -> System.out.println("someObject exists at point, x = " + x + ", y = " + y);
            ...
        }
    }
    
    Możliwe jest również zagnieżdżanie wzorców dopasowania dla rekordów, tzw. Nested Record Patterns.
  • Współbieżność strukturalna [incubator]

    Współbieżność strukturalna ma na celu uproszczenie programowania wielowątkowego za pomocą strukturalnego interfejsu API dedykowanego współbieżności. Traktuje ona wiele zadań działających w różnych wątkach jako pojedynczą jednostkę pracy, usprawniając w ten sposób obsługę i anulowanie błędów. Temu rozwiązaniu poświeciliśmy osobny artykuł kilka dni temu — Współbieżność strukturalna w Javie 19
  • Vector API [incubator]

    Vector API jest częścią JDK od wersji Java 16 jako inkubator i był dalej rozwijany w Javie 17 i Javie 18. Nie ma on nic wspólnego z klasą java.util.Vector. W rzeczywistości chodzi o nowe API do matematycznego obliczania wektorów i jego mapowania na nowoczesne procesory SIMD (Single-Instruction-Multiple-Data).

    Java 19 dostarcza czwartą iterację, w której interfejs API został rozszerzony o nowe operacje wektorowe – a także możliwość przechowywania wektorów i odczytywania ich z segmentów pamięci (funkcja interfejsu Foreign Function & Memory API).
  • Linux/RISC-V Port

    RISC-V to bezpłatna i otwarta architektura zestawu instrukcji RISC (ISA), zaprojektowana pierwotnie na Uniwersytecie Kalifornijskim w Berkeley, a obecnie opracowana wspólnie pod patronatem RISC-V International. Jest już obsługiwany przez szeroką gamę narzędzi językowych. Stąd też przygotowywana jest obsługa rozwiązania z poziomu JDK.
Pełna lista zmian jest dostępna pod linkiem podanym na koniec rozdziału. Tam też znajduje się wskazanie API, w którym pojawiła się metoda newHashMap.

Java 19 okazuje się wersją, w której większość zmian znajduje się w przygotowaniu w ramach trybu preview lub nawet inkubatora. Niemniej trend zmian jest bardzo pozytywny. Widać, że regularnie pojawiają się rozwiązania upraszczające wykorzystanie języka. Na pewno warto je śledzić.
Szukasz dobrego kursu nowej Javy? Mamy dla Ciebie kurs oparty na 150 przykładach.
Kurs od Javy 8 do 14
Kurs nowej Javy składa się z kursu Javy 8 oraz Javy od wersji 9 do 17.
Autor: Jarek Klimas
Data: 20 września 2022
Labele:Backend, Poziom podstawowy, Java Linki
openjdk.org/projects/jdk/19
HashMap API 19
Kod klasy HashMap w Javie 19 [Github]
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