Sobes.tech
Middle

Miért fordulhatnak elő problémák a listákkal a data class-ben?

sobes.tech MI

Válasz az MI-től

A Kotlin adat osztályok listáival kapcsolatos problémák gyakran abból adódnak, hogy a listák (például List vagy MutableList) alapértelmezés szerint módosíthatók, és azok használata alapértelmezett paraméterként vagy az osztály tulajdonságaiként váratlan viselkedést eredményezhet:

  • Módosítható listák alapértelmezett paraméterként: Ha egy adat osztályban egy lista alapértelmezett paraméterként van beállítva, és ez a lista módosul, akkor az összes példány, amely ezt az alapértelmezett paramétert használja, ugyanarra a listaobjektumra fog hivatkozni. Ez azt eredményezi, hogy egy objektumban végrehajtott módosítások másik példányban is megjelennek.

  • Felületi másolat: Amikor egy adat osztályt másolunk a copy() metódussal, a listák referencia szerint másolódnak (shallow copy), nem hozunk létre új példányt a listáról. Egy objektum listájában végrehajtott módosítások a másikra is hatással lesznek.

  • Problémák az equals és hashCode metódusokkal: Ha a lista módosítható és az objektum létrehozása után megváltozik, ez megsértheti az equals és hashCode szerződést, ami különösen kritikus, ha az objektumokat Set-ben vagy Map-ban használjuk kulcsként.

Ezek elkerülése érdekében:

  • Használjon nem módosítható listákat (List a MutableList helyett), és inicializálja őket listOf()-val.
  • Ne használjon módosítható objektumokat alapértelmezett paraméterként.
  • Másoláskor hozzon létre példányokat a listákról, ha szükséges.

Példa:

data class User(
    val name: String,
    val tags: List<String> = listOf() // nem módosítható alapértelmezett lista
)

val user1 = User("Alice")
val user2 = user1.copy()

// user1.tags és user2.tags külön objektumok, biztonságosan használhatók

Így a problémák a mutabilitás és a listák közös használata miatt merülnek fel az adat osztály példányai között.