Rekordy (records) w Javie 15.

Java 15 wprowadza kilka ciekawych rozwiązań, nie tyle znanych już z innych języków, co po prostu przydatnych. Jednym z nich jest wprowadzenie rekordów, czyli swego rodzaju prostych klas bez konieczności pisania konstruktorów, getterów czy nadpisywania metod toString(), hashCode()equals().

Rekordy w Javie

Rekordy w Javie można porównać np. do znanego z Kotlina rozwiązania opartego o klasy do przechowywania danych, czyli data class. Czyli niemodyfikowalnej klasy bez konieczności implementowania właśnie metod equals(), hashCode()toString(). Co ciekawe w użyciu rekordów jest jeszcze jedno rozwiązanie znane z Kotlina, mianowicie odwołując się do danego pola nie wywołujemy gettera, ale bezpośrednio nazwę tego pola. Poniżej szybkie porównanie dwóch rozwiązań – opartego o klasę i rekord.

public class Order {

    private Integer id;
    private Integer clientId;
    private Integer[] productIds;

    public Order(Integer id, Integer clientId, Integer[] productIds) {
        this.id = id;
        this.clientId = clientId;
        this.productIds = productIds;
    }

    public Integer getId() {
        return id;
    }

    public Integer getClientId() {
        return clientId;
    }

    public Integer[] getProductIds() {
        return productIds;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        OrderData orderData = (OrderData) o;
        return id.equals(orderData.id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    @Override
    public String toString() {
        return "OrderData{" +
                "id=" + id +
                ", clientId=" + clientId +
                ", productIds=" + Arrays.toString(productIds) +
                '}';
    }
}

Jak widać sporo tu tzw. boilerplate’u, czyli powtarzalnego kodu. Skoro i tak większość kodu generuję tu automatycznie dzięki IDE, to czemu nie wprowadzić rozwiązania, które będzie to robić w tle. Czyli zrobić to:

record Order(int id, int clientId, int[] productIds){}

Teraz jeszcze kilka ważnych kwestii.

Rekordy są niemutowalne, odpowiadają więc klasom finalnym i nie mają setterów.

Rekordy mają domyślną implementację metod equals(), hashCode()toString(), więc w podanym przykładzie dla rozwiązania z użyciem klas, gdzie porównujemy jedynie pole id, dla rozwiązania z użyciem rekordu moglibyśmy i tak dodać trochę kodu i nadpisać te metody.

Rekordy można deklarować wewnątrz klas, tak jak klasy wewnętrzne.

Rekordy mogą implementować interfejsy, ale nie mogą rozszerzać klas.

W rekordach można tworzyć nowe pola (statyczne) i metody.

Użycie rekordów może więc wyglądać tak jak na poniższym przykładzie:

class Shop {

    record Order(int id, int clientId, int[] productIds) implements IOrder {

        static final LocalDateTime ORDER_DATE = LocalDateTime.now();

        public int orderSize() {
            return productIds.length;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Order order = (Order) o;
            return id == order.id;
        }

        @Override
        public int hashCode() {
            return Objects.hash(id);
        }
    }
}

Sam również mam kilka przemyśleń gdzie można wykorzystać rekordy. Często w Javie brakowało mi możliwości stworzenia prostej klasy do przechowania danych. Takiej krotki, która pozwałaby bez pisania wielu linijek kodu łączyć dane w jedną strukturę.

Jeżeli macie uwagi bądź pytania, piszcie w komentarzach.

PS. Staram się używać zamiennie polskich i oryginalnych nazw. W programowaniu angielski jest podstawowym językiem i często w ogóle nie używa się polskich określeń. Czasem polskie nazwy potrafią wręcz wprawić w zakłopotanie, jednak spotykam się z nimi w literaturze czy na innych blogach, więc taka zamienność nazw mam nadzieję, że będzie jedynie pomocna dla osób zaczynających programować.

Rekordy (records) w Javie 15.

Dodaj komentarz

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

Przewiń do góry