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)
