ProgramaciónDesarrollador Backend

Explique las diferencias entre las clases de datos (data classes), las clases normales y las clases con herencia en Kotlin. ¿En qué casos se debe utilizar data class y qué restricciones impone el compilador?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

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:

  • El constructor primario debe contener al menos un parámetro.
  • Todos los parámetros del constructor deben estar marcados como val o var.
  • Data class no puede ser abstract, open, sealed o inner.
  • No se recomienda usar data class para clases con lógica de negocio o jerarquías de herencia.

Pregunta engañosa

"¿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

Ejemplos de errores reales debido al desconocimiento de los matices del tema


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.