En Kotlin, data class están destinadas a almacenar datos. El compilador genera automáticamente para ellas los métodos equals(), hashCode(), toString(), así como las funciones copy() y componentN(), lo que facilita significativamente el trabajo con estos objetos:
data class User(val name: String, val age: Int) val u1 = User("Ivan", 30) val u2 = u1.copy(age = 31)
Las clases normales no tienen estos métodos autogenerados; todo se escribe manualmente. Es mejor usar data class para DTO, modelos y estructuras de datos.
Restricciones de data class:
val o var.abstract, open, sealed o inner."¿Se puede declarar una data class heredando de otra data class? ¿Por qué (o por qué no)?"
No, no se puede heredar directamente una data class de otra. La data class solo puede heredar de una interfaz o de una clase normal (no una data class). Esto se hizo para evitar confusiones con los métodos autogenerados (por ejemplo, la copia de propiedades heredadas no es obvia).
data class Base(val id: Int) data class Child(val name: String) : Base(1) // Error de compilación: no permitido
Historia
En un proyecto bancario se utilizó data class con lógica de negocio y herencia. Después de agregar un nuevo campo, se volvió imposible copiar correctamente los objetos, se perdió parte de la lógica de negocio (los métodos no fueron heredados), lo que llevó a errores en los cálculos de comisiones.
Historia
En una plataforma de comercio electrónico, se utilizó data class para almacenar el estado del carrito de usuario. Después de actualizar el estado a través de
copy(), se olvidó que las listas internas no se copian profundamente. Como resultado, había "fugas" de datos entre las sesiones de los usuarios.
Historia
En un proyecto con integración API externa, la serialización de data class en JSON llevó a la aparición de campos con visibilidad privada, lo que violaba el contrato de la API y causaba errores en el lado del cliente.