More

    Jak działa funkcjonalność Records w Java 14

    Z każdą nową wersją języka Java wprowadza się kilka propozycji nowych funkcjonalności w postaci tak zwanych preview features. Pojawiają się one w języku Java po to, aby programiści mogli spróbować jak się z nich korzysta, a następnie, aby wyrazili swoją opinię na temat tego, czy dane rozwiązanie im się podoba i powinno pozostać na stałe w języku Java, czy też nie jest im dana funkcjonalność potrzebna i wówczas – wraz z kolejną wersją Javy – zostanie ona usunięta. W tym wpisie omówię jak działa Records w Java 14.

    Jak włączyć preview features?

    Aby uzyskać dostęp do funkcji eksperymentalnych, należy je wcześniej odblokować w IntelliJ. W tym celu utwórz nowy projekt typu Java i jako wersję SDK wskaż Javę 14. Jeżeli jej nie posiadasz, w IntelliJ jest możliwość automatycznego pobrania Javy w wersji 14:

    Po utworzeniu projektu włącz w nim dostęp do funkcji eksperymentalnych. Wejdź zatem do funkcji File->Project structure i na zakładce z ustawieniami zmień Project language level na wersję 14 (Preview) – zgodnie z poniższym rysunkiem:

    Teraz możesz już wypróbować funkcje eksperymentalne.

    Czym jest Records?

    Bardzo często podczas programowania spotykamy się z sytuacją, w której potrzebujemy utworzyć prostą klasę przechowującą dane. Na przykład klasę Book, która przechowuje dane o jednej książce. Niech będą to title, author oraz year.

    Każdą taką klasę musimy wyposażyć z reguły w:

    • konstruktor inicjujący wartości pól obiektu
    • zestaw getterów
    • metody equals oraz hashCode
    • metodę toString

    Ten zestaw metod praktycznie zawsze się powtarza. Chcąc więc stworzyć sto różnych klas reprezentujących różne rodzaje danych, musimy sto razy napisać konstruktor, zestaw getterów itd. Dodatkowo z reguły chcemy, aby klasy te były niemutowalne, więc musimy pamiętać o słowach kluczowych final przy nazwie klasy oraz przy jej polach.

    Aby zaoszczędzić nam, programistom, pracy – w Javie wprowadzono eksperymentalnie nowy typ record, który służy do tworzenia „klas” przechowujących dane. Stwórzmy teraz taki przykładowy rekord oraz zobaczmy jak można go używać.

    Tworzenie Record w Java 14

    Stwórzmy teraz taki przykładowy rekord oraz zobaczmy jak można go używać.

    W tym celu utwórz pakiet com.remotedev.records, a w nim wybierz funkcję tworzenia nowej klasy:

    Zauważ, że na liście rodzajów klas do utworzenia pojawiła się nowa pozycja – Record (Preview Feature) – wybierz ją. Spowoduje to wygenerowanie następującego kodu:

    Widzimy, że zamiast słowa class pojawiło się słowo record. Dodajmy teraz pola do naszego rekordu:

    Dość nietypowo, prawda? Definicja pól wygląda jak lista parametrów. I to w zasadzie jest wszystko co musisz zrobić. Dodajmy teraz klasę Application, w której utworzymy obiekt rekordu Book:

    Uruchom teraz program – w terminalu pojawi się następujący tekst:

    Book[author=In Search of Lost Time, title=Marcel Proust, year=1913]

    Widać, że automatycznie wygenerowana została metoda toString. Sprawdźmy zatem co jeszcze wygenerowało się z naszych działań. Zajrzyj do katalogu out – będą w nim nasze dwie skompilowane klasy:

    A teraz otwórz i wejdź do pliku Book.class – zawartość powinna wyglądać mniej więcej tak:

    Widzimy, że jest to zwykła klasa oznaczona jako final, która dziedziczy z klasy java.lang.Record. Widoczne są również gettery (zauważ, że bez słowa get w nazwie), konstruktor oraz pozostałe wygenerowane metody.

    Spróbujmy utworzyć teraz jeszcze dwa obiekty typu Book i porównajmy ich hashCode:

    package com.remotedev.records;
    
    public class Application {
    
      public static void main(String[] args) {
        Book b1 = new Book("In Search of Lost Time", "Marcel Proust", 1913);
        Book b2 = new Book("In Search of Lost Time", "Marcel Proust", 1913);
        Book b3 = new Book("Ulysses", "James Joice", 1904);
        System.out.println(b1.hashCode());
        System.out.println(b2.hashCode());
        System.out.println(b3.hashCode());
      }
    }
    

    Sprawdźmy jaki będzie wynik działania tego programu:

    Widzimy, że pierwsze dwie wartości hashCode są takie same. Co to oznacza? Oznacza to, że Java nie utworzyła dwóch osobnych obiektów dla zmiennych b1 oraz b2. Tak naprawdę Java podczas tworzenia obiektu b2 „zauważyła”, że ma już taki obiekt w pamięci (wskazywany przez zmienną b1) i w związku z tym, że obiekty te są niemutowalne – do zmiennej b2 wpisała po prostu referencję do tego samego, istniejącego już ubiektu.

    Opisany tu mechanizm działania jest dokładnie taki sam jak w przypadku puli Stringów. Ma on za zadanie optymalizować użycie pamięci w Javie.

    Podsumowanie

    Czy rekordy w Javie przyjmą się i będą powszechnie używane? Ciężko jednoznacznie powiedzieć. Mamy Lomboka, który oferuje podobne funkcjonalności. Czas zatem pokaże.

    Andrzej Jaromin
    Senior Software Developer specjalizujący się między innymi w języku Java. Od 25 lat związany zawodowo z IT. Pracuje zdalnie dla klientów z Azji Południowo-Wschodniej oraz Europy, łącząc podróże z pracą.

    Latest articles

    11 bibliotek, które powinien znać każdy iOS developer

    Przez dwanaście lat, App Store mocno zadomowił się na naszych urządzeniach mobilnych, oferując coraz to większą różnorodność aplikacji. W tym roku ich...

    Jak używać Web Components w Reactcie i Angularze

    Kontynuujemy temat użycia Web Components w budowaniu aplikacji. W tym wpisie przyjrzymy się ich zastosowaniu wraz z popularnymi frameworkami JS-wymi.

    Hacktoberfest – ten hackathon to małe piwo

    Hackathon to wydarzenie programistyczne polegające na zrealizowaniu w określonym czasie projektu zgodnego założeniami organizatora. Większość z was pewnie kojarzy słowo Hackathon. Najczęściej...

    #IThotStory, czyli największe wpadki programistów

    Co prawda programista to nie saper i może pomylić się więcej niż raz, ale każda wpadka niesie za sobą jakieś ryzyko. Zaliczyliście...

    Leave a reply

    Please enter your comment!
    Please enter your name here

    Related articles

    X