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éshashCodemetódusokkal: Ha a lista módosítható és az objektum létrehozása után megváltozik, ez megsértheti azequalséshashCodeszerződést, ami különösen kritikus, ha az objektumokatSet-ben vagyMap-ban használjuk kulcsként.
Ezek elkerülése érdekében:
- Használjon nem módosítható listákat (
ListaMutableListhelyett), és inicializálja őketlistOf()-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.