Prečo môžu nastať problémy so zoznamami v data class?
sobes.tech AI
Odpoveď od AI
Problémy s listami v dátovej triede Kotlin sú často spojené s tým, že zoznamy (napríklad List alebo MutableList) sú predvolene modifikovateľné a ich používanie ako predvolené parametre alebo vlastnosti triedy môže viesť k neočakávanému správaniu:
-
Modifikovateľné zoznamy ako predvolené parametre: Ak je v dátovej triede zoznam nastavený ako predvolený parameter a tento zoznam sa zmení, všetky inštancie, ktoré používajú tento predvolený parameter, budú odkazovať na ten istý objekt zoznamu. To spôsobí, že zmeny v zozname v jednom objekte sa prejavia aj v iných.
-
Povrchové kopírovanie: Pri kopírovaní dátovej triedy pomocou metódy
copy()sa zoznamy kopírujú referenciou (povrchové kopírovanie), a nie je vytvorená nová kópia zoznamu. Zmeny v zozname jedného objektu ovplyvnia druhý. -
Problémy s
equalsahashCode: Ak je zoznam modifikovateľný a mení sa po vytvorení objektu, môže to narušiť kontraktequalsahashCode, čo je obzvlášť kritické pri použití objektov v kolekciách akoSetalebo ako kľúče vMap.
Aby ste sa vyhli týmto problémom:
- Používajte nemodifikovateľné zoznamy (
ListnamiestoMutableList) a inicializujte ich pomocoulistOf(). - Nepoužívajte modifikovateľné objekty ako predvolené parametre.
- Pri kopírovaní objektu vytvárajte kópie zoznamov, ak je to potrebné.
Príklad:
data class User(
val name: String,
val tags: List<String> = listOf() // nemodifikovateľný predvolený zoznam
)
val user1 = User("Alice")
val user2 = user1.copy()
// user1.tags a user2.tags sú rôzne objekty, bezpečne na použitie
Takto problémy vznikajú kvôli mutabilite a zdieľaniu zoznamov medzi inštanciami dátovej triedy.