У цій статті ви навчитеся створювати класи даних у Kotlin. Ви також дізнаєтесь про вимоги, яким повинен відповідати клас даних, та їх стандартні функціональні можливості.
Може виникнути ситуація, коли вам потрібно створити клас виключно для зберігання даних. У таких випадках ви можете позначити клас як такий, data
що створює клас даних. Наприклад,
клас даних Особа (ім'я домену: Рядок, варіація: Int)
Для цього класу компілятор автоматично генерує:
copy()
функція,equals()
іhashCode()
пара, іtoString()
форма первинного конструктораcomponentN()
функції
Перш ніж детально говорити про ці функції, давайте поговоримо про вимоги, яким повинен відповідати клас даних.
Вимоги до класу даних Kotlin
Ось вимоги:
- Первинний конструктор повинен мати принаймні один параметр.
- Параметри первинного конструктора повинні бути позначені як
val
(лише для читання) абоvar
(для читання-запису). - Клас не може бути відкритим, абстрактним, внутрішнім або закритим.
- Клас може розширювати інші класи або реалізовувати інтерфейси. Якщо ви використовуєте версію Kotlin до 1.1, клас може реалізовувати лише інтерфейси.
Приклад: Клас даних Kotlin
data class User(val name: String, val age: Int) fun main(args: Array) ( val jack = User("jack", 29) println("name = $(jack.name)") println("age = $(jack.age)") )
Коли ви запускаєте програму, результат буде:
ім'я = вік Джека = 29
Коли ви повідомляєте клас даних, компілятор автоматично генерує кілька функцій , таких як toString()
, equals()
, і hashcode()
т.д. за лаштунками. Це допомагає зберегти стислий код. Якби ви використовували Java, вам потрібно було б написати багато типового коду.
Давайте скористаємось цими функціями:
Копіювання
Для класу даних ви можете створити копію об’єкта з деякими його властивостями, різними за допомогою copy()
функції. Ось як це працює:
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) // using copy function to create an object val u2 = u1.copy(name = "Randy") println("u1: name = $(u1.name), name = $(u1.age)") println("u2: name = $(u2.name), name = $(u2.age)") )
Коли ви запускаєте програму, результат буде:
u1: ім'я = Джон, ім'я = 29 u2: ім'я = Ренді, ім'я = 29
метод toString ()
Функція toString () повертає рядкове представлення об'єкта.
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) println(u1.toString()) )
Коли ви запускаєте програму, результат буде:
Користувач (ім'я = Джон, вік = 29)
hashCode () і дорівнює ()
hasCode()
Метод повертає хеш - код для об'єкта. Якщо два об'єкти рівні, hashCode()
отримує однаковий цілий результат. Рекомендована література: hashCode ()
В equals()
повертається , true
якщо два об'єкта рівні (є ж hashCode()
). Якщо об'єкти не рівні, equals()
повертається false
. Рекомендована література: дорівнює ()
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) val u2 = u1.copy() val u3 = u1.copy(name = "Amanda") println("u1 hashcode = $(u1.hashCode())") println("u2 hashcode = $(u2.hashCode())") println("u3 hashcode = $(u3.hashCode())") if (u1.equals(u2) == true) println("u1 is equal to u2.") else println("u1 is not equal to u2.") if (u1.equals(u3) == true) println("u1 is equal to u3.") else println("u1 is not equal to u3.") )
Коли ви запускаєте програму, результат буде:
u1 хеш-код = 71750738 u2 хеш-код = 71750738 u3 хеш-код = 771732263 u1 дорівнює u2. u1 не дорівнює u3.
Декларації про деструктуризацію
Ви можете деструктурувати об'єкт за кількістю змінних, використовуючи деструктивне оголошення. Наприклад:
клас даних Користувач (ім'я val: Рядок, вік val: Int, Val стать: String) fun main(args: Array) ( val u1 = User("John", 29, "Male") val (name, age, gender) = u1 println("name = $name") println("age = $age") println("gender = $gender") )
Коли ви запускаєте програму, результат буде:
ім'я = Джон вік = 29 стать = чоловік
Це стало можливим, оскільки компілятор генерує componentN()
функції всіх властивостей для класу даних. Наприклад:
data class User(val name: String, val age: Int, val gender: String) fun main(args: Array) ( val u1 = User("John", 29, "Male") println(u1.component1()) // John println(u1.component2()) // 29 println(u1.component3()) // "Male" )
Коли ви запускаєте програму, результат буде:
Іван 29 Чоловік