1.1.50.12. fejezet, Adat osztályok

Ezeket az osztályokat főleg adat tárolásra használják.

data class User(val name: String, val age: Int)

Minden adat osztályhoz a fordító létrehozza a következő függvényeket:

  • .equals()/.hashCode()
  • .toString()
  • .componentN()
  • .copy()

A létrehozott kód konzisztenciájának és értelmes viselkedésének biztosítása érdekében az adatosztályoknak a következő követelményeknek kell megfelelniük:

  • Az elsődleges konstruktornak legalább egy paraméterrel kell rendelkeznie.
  • Minden elsődleges konstruktor paramétert var- vagy val-ként kell megjelölni.
  • Az adatosztályok nem lehetnek absztraktak, nyitottak, lezártak vagy belsőek.

Ezenkívül az adatosztály tagjainak generálása a következő szabályokat követi a tagok öröklése tekintetében:

  • Ha explicit implementációi vannak a .equals().hashCode().toString() metódusoknak az adatosztály törzsében vagy egy szuperosztály implementációiban, akkor ezek a függvények nem jönnek létre, és a meglévő implementációkat használják.
  • Ha egy szupertípus implementálja a .componentN() metódust ami open és kompatibilis típussal tér vissza, akkor a megfelelő függvények létrejönnek az adatosztályhoz, és felülbírálják a szupertípus függvényeit. Ha a szupertípus funkcióit nem lehet felülbírálni inkompatibilis szignatúra vagy véglegességük (final) miatt, a rendszer hibát jelent.
  • A .componentN() és .copy() függvények explicit implementációinak megadása nem engedélyezett.

Az adatosztályok más osztályokat is kiterjeszthetnek (példákért lásd: Lezárt osztályok).

Az osztálytörzsben deklarált tulajdonságok

A fordító csak az elsődleges konstruktorban definiált tulajdonságokat használja az automatikusan generált függvényekhez. Ha ki szeretnénk zárni egy tulajdonságot a létrehozott implementációkból, deklaráljuk azt az osztály törzsében:

data class Person(val name: String) {
    var age: Int = 0
}
 
val person1 = Person("John")
val person2 = Person("John")
person1.age = 10
person2.age = 20
 
println("person1 == person2: ${person1 == person2}")
// person1 == person2: true
 
println("person1 with age ${person1.age}: ${person1}")
// person1 with age 10: Person(name=John)
 
println("person2 with age ${person2.age}: ${person2}")
// person2 with age 20: Person(name=John)

Másolás

Használjuk a .copy metódust egy objektum másolásához, lehetővé téve néhány tulajdonságának megváltoztatását, miközben a többit változatlanul hagyja.

fun copy(name: String = this.name, age: Int = this.age) = User(name, age)
 
val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)

Adatosztályok és szerkezetátalakítási deklarációk

Az adatosztályokhoz generált komponensfüggvények lehetővé teszik azok használatát a deklarációk strukturálásában:

val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age")
// Jane, 35 years of age

Standard adatosztályok

A szabványos könyvtár biztosítja a Pair és Triple osztályokat.