Klasa danych Kotlin

W tym artykule nauczysz się tworzyć klasy danych w Kotlinie. Dowiesz się również o wymaganiach, jakie musi spełniać klasa danych oraz o ich standardowych funkcjonalnościach.

Może wystąpić sytuacja, w której będziesz musiał utworzyć klasę wyłącznie do przechowywania danych. W takich przypadkach możesz oznaczyć klasę, dataaby utworzyć klasę danych. Na przykład,

 klasa danych Osoba (nazwa val: String, var wiek: Int)

Dla tej klasy kompilator automatycznie generuje:

  • copy()funkcja equals()i hashCode()para oraz toString()forma głównego konstruktora
  • componentN() Funkcje

Zanim szczegółowo omówimy te funkcje, porozmawiajmy o wymaganiach, które musi spełniać klasa danych.

Wymagania klasy danych Kotlin

Oto wymagania:

  • Konstruktor podstawowy musi mieć co najmniej jeden parametr.
  • Parametry konstruktora podstawowego muszą być oznaczone jako val(tylko do odczytu) lub var(do odczytu i zapisu).
  • Klasa nie może być otwarta, abstrakcyjna, wewnętrzna ani zapieczętowana.
  • Klasa może rozszerzać inne klasy lub implementować interfejsy. Jeśli używasz wersji Kotlin wcześniejszej niż 1.1, klasa może implementować tylko interfejsy.

Przykład: klasa danych 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)") )

Po uruchomieniu programu wynik będzie następujący:

 imię = wiek Jacka = 29

Kiedy deklarujesz klasę danych, kompilator automatycznie generuje kilka funkcji, takich jak toString(), equals(), hashcode()itp za kulisami. Pomaga to zachować zwięzły kod. Gdybyś używał Javy, musiałbyś napisać dużo standardowego kodu.

Skorzystajmy z tych funkcji:

Biurowy

W przypadku klasy danych można utworzyć kopię obiektu z niektórymi właściwościami innymi za pomocą copy()funkcji. Oto jak to działa:

 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)") )

Po uruchomieniu programu wynik będzie następujący:

 u1: imię = John, imię = 29 u2: imię = Randy, imię = 29

toString ()

Funkcja toString () zwraca ciąg znaków reprezentujący obiekt.

 data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) println(u1.toString()) )

Po uruchomieniu programu wynik będzie następujący:

 Użytkownik (imię = Jan, wiek = 29)

hashCode () i równa się ()

hasCode()Metoda zwraca kod skrótu dla tego obiektu. Jeśli dwa obiekty są równe, hashCode()daje ten sam wynik w postaci liczby całkowitej. Zalecana lektura: hashCode ()

Te equals()powroty truejeśli dwa obiekty są równe (ma taki sam hashCode()). Jeśli obiekty nie są równe, equals()zwraca false. Zalecana lektura: równa się ()

 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.") )

Po uruchomieniu programu wynik będzie następujący:

hashcode u1 = 71750738 hashcode u2 = 71750738 hashcode u3 = 771732263 u1 jest równe u2. u1 nie jest równe u3.

Deklaracje destrukturyzacyjne

Możesz zniszczyć obiekt na wiele zmiennych za pomocą niszczącej deklaracji. Na przykład:

 klasa danych Użytkownik (nazwa wartości: String, wiek wartości: Int, płeć wartości: Ciąg) fun main(args: Array) ( val u1 = User("John", 29, "Male") val (name, age, gender) = u1 println("name = $name") println("age = $age") println("gender = $gender") )

Po uruchomieniu programu wynik będzie następujący:

 imię = Jan wiek = 29 płeć = Mężczyzna

Było to możliwe, ponieważ kompilator generuje componentN()funkcje wszystkich właściwości dla klasy danych. Na przykład:

 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" )

Po uruchomieniu programu wynik będzie następujący:

 John 29 Male

Interesujące artykuły...