Sobes.tech
Middle

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 equals a hashCode: Pokud je seznam modifikovatelný a mění se po vytvoření objektu, může to narušit kontrakt equals a hashCode, což je obzvlášť kritické při použití objektů v kolekcích typu Set nebo jako klíče v Map.

Abychom těmto problémům předešli:

  • Používejte nemodifikovatelné seznamy (List místo MutableList) 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.