Публикация

Data классы в Kotlin

Если вы недавно начали свое знакомство с Kotlin и не до конца понимаете, что такое data классы и как ими пользовать, то тут я постараюсь максимально понятно это пояснить.

Манипулируя данными в бизнес-логике мы часто работаем с классами хранящими только данные. Kotlin представил концепцию классов данных, которая из себя представляет класс не инкапсулирующий какую-либо дополнительную логику и по сути есть контейнером данных.

Класс данных в Java

Те кто следит за релизами Java знает, что в JDK 16 в Java добавили Record классы, которые очень сильно похожи на Data классы в Kotlin.

Так как в Kotlin классы данных были изначально, то я продемонстрирую аналогию с Java до появления Records, чтобы далее иметь лучше понимание тому как устроены Data Classes в Kotlin.

Давайте представим, что у нас есть класс Employee, который хранит основную информацию о сотруднике компании:

import java.util.Objects;

public class Employee {

    private Long id;
    private String firstName;
    private String lastName;
    private String title;

    public Employee(Long id, String firstName, String lastName, String title) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.title = title;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;

        return Objects.equals(id, employee.id)
                && Objects.equals(firstName, employee.firstName)
                && Objects.equals(lastName, employee.lastName)
                && Objects.equals(title, employee.title);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, firstName, lastName, title);
    }
}

Казалось бы, класс не имеющий бизнес-логики и содержащий только характеристики сотрудника компании, но у нас уже более 50 строк кода.

Если вам интересно как устроены Record Classes в Java 16, то тут я также постарался пояснить мотивацию их появления.

Data класс в Kotlin

Сразу же в сравнение как выглядит синтаксически тот же класс Employee:

data class Employee(
        val id: Long,
        val firstName: String,
        val lastName: String,
        var title: String?
)

Согласитесь, для понимания и читаемости этот фрагмент кода будет восприниматься бегло и понятно. Также, возникает вопрос, где же наши конструкторы и equals(), hashCode()?

Тут также все просто, все функции будут сгенерированы автоматически на основе описанных нами полей класса.

Также, обратите внимание, что нам не нужно дополнительно описывать конструктор, мы объявляем его сразу же после имени класса, где и описываем поля класса.

Как использовать?

В Java мы привыкли использовать Getters/Setters для взаимодействия с данными класса. Тут также будут эти методы, но они именуются без get..()/set..():

val employee = Employee(1, "Alex", "Barchuk", "Author at bcode.dev")
println(employee.firstName + " " + employee.lastName)

И если мы указали например для поля title, что оно может быть null:

val employee = Employee(1, "Alex", "Barchuk")
employee.title = "Author at bcode.dev"

Используя Data Classes мы должны следовать некоторым правилам:

  • Data Class не может быть как open, sealed, inner или abstract;
  • Основной конструктор должен содержать минимум один параметр;
  • Все параметры основного конструктора должны быть val или var.
Опубликовано: 29 июля 2021 г.Просмотров: 56

Комментарии

Мы не даем слово анониму 😶
Войдите, пожалуйста.

Еще никто не комментировал эту публикацию 🤔