Data class: класс данных в Kotlin

Data class — это простой класс в Kotlin, который используется для хранения данных или состояния и содержит стандартную функциональность. Ключевое слово data используется для объявления класса как класса данных.

 
data class User(val name: String, val age: Int) 

Объявление класса данных должно содержать по крайней мере один первичный конструктор с аргументом свойства(val или var).

Класс данных внутри содержит следующие функции:

  • equals(): Boolean
  • hashCode(): Int
  • toString(): String
  • component(): функции, соответствующие свойствам
  • copy()

Благодаря наличию вышеперечисленных функций внутри класса данных Data class исключает шаблонный код.

Компрессия между классом данных Java и классом данных Kotlin

Если мы хотим создать запись пользователя в Java с использованием класса данных, потребуется много шаблонного кода.

 
import java.util.Objects; 
 
public class User { 
    private String name; 
    private int id; 
    private String email; 
 
    public User(String name, int id, String email) { 
        this.name = name; 
        this.id = id; 
this.email = email; 
    } 
 
    public String getName() { 
        return name; 
    } 
 
    public void setName(String name) { 
        this.name = name; 
    } 
 
    public intgetId() { 
        return id; 
    } 
 
    public void setId(int id) { 
        this.id = id; 
    } 
 
    public String getEmail() { 
        return email; 
    } 
 
    public void setEmail(String email) { 
this.email = email; 
    } 
 
    @Override 
    public boolean equals(Object o) { 
        if(this == o) return true; 
        if(!(o instanceof User)) return false; 
        User user =(User) o; 
        return getId() == user.getId() && 
Objects.equals(getName(), user.getName()) && 
Objects.equals(getEmail(), user.getEmail()); 
    } 
 
    @Override 
    public inthashCode() { 
 
        return Objects.hash(getName(), getId(), getEmail()); 
    } 
 
    @Override 
    public String toString() { 
        return "User{" + 
                "name='" + name + '\'' + 
                ", id=" + id + 
                ", email='" + email + '\'' + 
                '}'; 
    } 
} 

Вызов конструктора вышеуказанного класса данных Java с использованием объекта класса User как

 
class MyClass{ 
    public static void main(String agrs[]){ 
        User u = new User("Ashu",101,"mymail@mail.com"); 
System.out.println(u); 
    } 
} 

Выход:

User{name='Ashu', id=101, email='[email protected]'} 

Приведенный выше код класса данных Java переписан в коде данных Kotlin в одну строку:

 
data class User(var name: String, var id: Int, var email: String) 

Вызов конструктора вышеуказанного класса данных Kotlin с использованием объекта класса User:

 
fun main(agrs: Array) { 
val u = User("Ashu", 101, "mymail@mail.com") 
println(u) 
} 

Выход:

User(name=Ashu, id=101, [email protected]) 

Требования к классу данных

Чтобы создать класс данных, нам необходимо выполнить следующие требования:

  • Класс содержит первичный конструктор по крайней мере с одним параметром.
  • Параметры основного конструктора, помеченные как val или var.
  • Класс данных не может быть абстрактным, внутренним, открытым или запечатанным.
  • До версии 1.1 класс данных может реализовывать только интерфейс. После этого классы данных могут расширять другие классы.

Методы класса данных Kotlin toString()

Класс данных Kotlin фокусируется только на данных, а не на реализации кода.

Давайте посмотрим на простую программу без класса данных. В этом классе мы пытаемся напечатать ссылку на класс Product, используя его объект.

 
class Product(varitem: String, var price: Int) 
 
fun main(agrs: Array) { 
val p = Product("laptop", 25000) 
println(p) 
} 

При печати ссылки на класс Product отображается hashCode() с именем класса Product. Не печатает данные.

Выход:

[email protected] 

Вышеупомянутая программа переписана с использованием класса данных и печати ссылки на класс продукта и отображения данных объекта. Это происходит потому, что класс данных внутри содержит функцию toString(), которая отображает строковое представление объекта.

 
data class Product(varitem: String, var price: Int) 
 
fun main(agrs: Array) { 
val p = Product("laptop", 25000) 
println(p) 
} 

Выход:

Product(name=laptop, price=25000) 

classequals() и hashCode()

Метод equal() используется для проверки того, что другой объект «равен» текущему объекту. При сравнении двух или более hashCode() метод equals() возвращает true, если hashCode() равны, в противном случае он возвращает false.

Давайте рассмотрим пример, в котором обычный класс сравнивает две ссылки одного и того же класса Product, имеющие одинаковые данные.

 
class Product(varitem: String, var price: Int) 
 
fun main(agrs: Array) { 
val p1 = Product("laptop", 25000) 
val p2 = Product("laptop", 25000) 
println(p1==p2) 
println(p1.equals(p2)) 
} 

В приведенной выше программе ссылка p1 и ссылка p2 имеют разные ссылки. Из-за разных эталонных значений в p1 и p2 при сравнении отображается ошибка.

Выход:

false 
false 

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

Метод hashCode() возвращает хэш-код для объекта. hashCode() дает тот же целочисленный результат, если два объекта равны.

 
data class Product(varitem: String, var price: Int) 
 
fun main(agrs: Array) { 
val p1 = Product("laptop", 25000) 
val p2 = Product("laptop", 25000) 
println(p1==p2) 
println(p1.equals(p2)) 
} 

Выход:

true 
true 

Метод copy()

Класс данных предоставляет метод copy() в Котлин, который используется для создания копии (или двоеточия) объекта. С помощью метода copy() можно изменить некоторые или все свойства объекта.

Например:

 
data class Product(var item: String, var price: Int) 
 
fun main(agrs: Array) { 
val p1 = Product("laptop", 25000) 
println("p1 object contain data : $p1") 
val p2 = p1.copy() 
println("p2 copied object contains default data of p1: $p2") 
val p3 = p1.copy(price = 20000) 
println("p3 contain altered data of p1 : $p3") 
} 

Выход:

p1 object contain data : Product(item=laptop, price=25000) 
p2 copied object contains default data of p1: Product(item=laptop, price=25000) 
p3 contain altered data of p1 : Product(item=laptop, price=20000) 

Аргументы по умолчанию и именованные аргументы в Data-класс

Мы также можем назначить аргументы по умолчанию в основном конструкторе класса данных. Эти значения по умолчанию могут быть изменены позже в программе, если это необходимо.

Например:

 
data class Product(var item: String = "laptop", var price: Int = 25000) 
 
fun main(agrs: Array) { 
val p1 = Product(price = 20000) 
println(p1) 
} 

Выход:

Product(item=laptop, price=20000) 

Оцените статью