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.
- A hozzászóláshoz be kell jelentkezni