In dit artikel leer je dataklassen maken in Kotlin. Je leert ook over vereisten waaraan dataklassen moeten voldoen, en hun standaardfunctionaliteiten.
Er kan een situatie ontstaan waarin u een klasse moet maken die alleen gegevens bevat. In dergelijke gevallen kunt u de klasse markeren data
om een dataklasse te maken. Bijvoorbeeld,
dataklasse Persoon (val name: String, var age: Int)
Voor deze klasse genereert de compiler automatisch:
copy()
functieequals()
enhashCode()
paar, entoString()
vorm van de primaire constructorcomponentN()
functies
Voordat we in detail over deze functies ingaan, laten we het hebben over de vereisten waaraan een dataklasse moet voldoen.
Vereisten voor Kotlin-gegevensklassen
Hier zijn de vereisten:
- De primaire constructor moet ten minste één parameter hebben.
- De parameters van de primaire constructor moeten worden gemarkeerd als
val
(alleen-lezen) ofvar
(lezen-schrijven). - De klas kan niet open, abstract, innerlijk of verzegeld zijn.
- De klasse kan andere klassen uitbreiden of interfaces implementeren. Als je Kotlin-versie vóór 1.1 gebruikt, kan de klasse alleen interfaces implementeren.
Voorbeeld: Kotlin Data Class
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)") )
Wanneer u het programma uitvoert, is de uitvoer:
naam = jack leeftijd = 29
Wanneer u een data-klasse te verklaren, de compiler genereert automatisch verschillende functies zoals toString()
, equals()
, hashcode()
etc achter de schermen. Dit helpt om uw code beknopt te houden. Als je Java had gebruikt, zou je veel standaardcode moeten schrijven.
Laten we deze functies gebruiken:
Kopiëren
Voor een dataklasse kunt u een kopie van een object maken met een aantal eigenschappen die anders zijn met behulp van de copy()
functie. Dit is hoe het werkt:
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)") )
Wanneer u het programma uitvoert, is de uitvoer:
u1: naam = John, naam = 29 u2: naam = Randy, naam = 29
toString () methode
De functie toString () retourneert een tekenreeksweergave van het object.
data class User(val name: String, val age: Int) fun main(args: Array) ( val u1 = User("John", 29) println(u1.toString()) )
Wanneer u het programma uitvoert, is de uitvoer:
Gebruiker (naam = Jan, leeftijd = 29)
hashCode () en is gelijk aan ()
De hasCode()
methode retourneert hash-code voor het object. Als twee objecten gelijk zijn, hashCode()
levert dit hetzelfde gehele resultaat op. Aanbevolen literatuur: hashCode ()
Het equals()
resultaat true
als twee objecten gelijk zijn (heeft hetzelfde hashCode()
). Als objecten niet gelijk zijn, wordt equals()
geretourneerd false
. Aanbevolen literatuur: gelijk aan ()
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.") )
Wanneer u het programma uitvoert, is de uitvoer:
u1 hashcode = 71750738 u2 hashcode = 71750738 u3 hashcode = 771732263 u1 is gelijk aan u2. u1 is niet gelijk aan u3.
Verklaringen betreffende vernietiging
U kunt een object in een aantal variabelen vernietigen met behulp van een vernietigende declaratie. Bijvoorbeeld:
dataklasse Gebruiker (val naam: String, val leeftijd: Int, val geslacht: 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") )
Wanneer u het programma uitvoert, is de uitvoer:
naam = John leeftijd = 29 geslacht = Man
Dit was mogelijk omdat de compiler componentN()
functies genereert alle eigenschappen voor een dataklasse. Bijvoorbeeld:
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" )
Wanneer u het programma uitvoert, is de uitvoer:
John 29 Man