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ę, data
aby utworzyć klasę danych. Na przykład,
klasa danych Osoba (nazwa val: String, var wiek: Int)
Dla tej klasy kompilator automatycznie generuje:
copy()
funkcjaequals()
ihashCode()
para oraztoString()
forma głównego konstruktoracomponentN()
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) lubvar
(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 true
jeś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