Proč mohou nastat problémy s seznamy v data class?
sobes.tech AI
Odpověď od AI
Problémy s seznamy v datových třídách Kotlin jsou často spojeny s tím, že seznamy (například List nebo MutableList) jsou ve výchozím nastavení modifikovatelné a jejich použití jako výchozích parametrů nebo vlastností třídy může vést k neočekávanému chování:
-
Modifikovatelné seznamy jako výchozí parametry: Pokud je v datové třídě seznam nastaven jako výchozí parametr a tento seznam je změněn, všechny instance, které tento výchozí parametr používají, odkazují na stejný objekt seznamu. To znamená, že změny seznamu v jednom objektu se projeví i v ostatních.
-
Povrchové kopírování: Při kopírování datové třídy pomocí metody
copy()jsou seznamy kopírovány referencí (povrchová kopie), nikoli vytvořením nové kopie seznamu. Změny v seznamu jednoho objektu ovlivní druhý. -
Problémy s
equalsahashCode: Pokud je seznam modifikovatelný a mění se po vytvoření objektu, může to narušit kontraktequalsahashCode, což je obzvlášť kritické při použití objektů v kolekcích typuSetnebo jako klíče vMap.
Abychom těmto problémům předešli:
- Používejte nemodifikovatelné seznamy (
ListmístoMutableList) a inicializujte je pomocílistOf(). - Neužívejte modifikovatelné objekty jako výchozí parametry.
- Při kopírování objektu vytvářejte kopie seznamů, pokud je to nutné.
Příklad:
data class User(
val name: String,
val tags: List<String> = listOf() // nemodifikovatelný výchozí seznam
)
val user1 = User("Alice")
val user2 = user1.copy()
// user1.tags a user2.tags jsou různé objekty, lze je bezpečně používat
Tímto způsobem problémy vznikají kvůli mutabilitě a sdílení seznamů mezi instancemi datové třídy.