Sobes.tech
Middle

Why can there be issues with lists in data classes?

sobes.tech AI

Answer from AI

Problems with lists in Kotlin data classes are often related to the fact that lists (e.g., List or MutableList) are mutable by default and using them as default parameters or class properties can lead to unexpected behavior:

  • Mutable lists as default parameters: If a list is set as a default parameter in a data class and this list is modified, all instances using this default parameter will reference the same list object. This causes changes in the list of one object to reflect in others.

  • Shallow copying: When copying a data class using the copy() method, lists are copied by reference (shallow copy), not creating a new list copy. Changes in the list of one object will affect the other.

  • Issues with equals and hashCode: If the list is mutable and changes after the object is created, it can break the equals and hashCode contract, which is especially critical when using objects in collections like Set or as keys in a Map.

To avoid these problems:

  • Use immutable lists (List instead of MutableList) and initialize them with listOf().
  • Do not use mutable objects as default parameters.
  • When necessary, create copies of lists when copying an object.

Example:

data class User(
    val name: String,
    val tags: List<String> = listOf() // immutable default list
)

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

// user1.tags and user2.tags are different objects, safe to use

Thus, problems arise due to mutability and shared use of lists between data class instances.