Клас даних Котліна

У цій статті ви навчитеся створювати класи даних у 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 Чоловік

Цікаві статті...