ProgramaciónDesarrollador Kotlin, Desarrollador Android

¿Qué es un data object en Kotlin, cómo usarlo, y en qué se diferencia de un objeto normal y una data class?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

Data object — es un nuevo tipo de declaración en Kotlin (desde la versión 1.9), que combina las propiedades de un objeto singleton y una data class. Está diseñado para casos en los que se desea tener solo una instancia de un objeto y métodos generados automáticamente como equals, hashCode, toString (similar a data class).

Historia de la pregunta

Antes, para almacenar entidades únicas con métodos toString() y equals() autogenerados, era necesario tener que escribir un objeto con implementaciones manuales o usar de manera comprometedora una data class con un único objeto (y no con instancias).

Problema

Los objetos singleton (object) no tienen equals, hashCode, toString autogenerados, mientras que la data class asume múltiples instancias, lo que no se adapta a modelos exhaustivos tipo enum-like.

Solución

Con la aparición de data object, ambas tareas se resuelven de manera concisa:

  • La clase puede ser solo una instancia (singleton).
  • El compilador genera los métodos multimedia necesarios.

Ejemplo de código:

data object LoadingState data object NoData println(LoadingState == LoadingState) // true println(LoadingState.toString()) // LoadingState

Características clave:

  • Siempre singleton — no se puede crear una segunda instancia.
  • El compilador añade métodos equals, hashCode, toString como en data class.
  • Especialmente conveniente aplicarlo junto con sealed interface para modelar estados.

Preguntas engañosas.

¿En qué se diferencia un data object de un objeto normal?

Solo el data object recibe la autogeneración de los métodos equals, hashCode, toString a nivel de compilador; el objeto normal usa las implementaciones de Any (igualdad referencial, toString poco rico).

¿Se puede hacer un data object con parámetros en el constructor?

No, un data object no puede tener un constructor con parámetros. Siempre es sin parámetros, ya que solo existe una instancia.

¿Se puede heredar un data object?

Sí, un data object puede implementar interfaces, incluidas interfaces selladas, y ser parte de jerarquías de estados.

Ejemplo:

sealed interface Result data object Success : Result data object Failure : Result

Errores típicos y anti-patrón

  • Intentar agregar campos de constructor en un data object (esto está prohibido).
  • Usar data class donde se supone una única instancia.

Ejemplo de la vida real

Caso negativo

El desarrollador modela "sin datos" como objeto NoData, luego lo compara con otro objeto usando equals() y obtiene un resultado inesperado (visualización referencial, no sustancial).

Ventajas:

  • Simplicidad de declaración.

Desventajas:

  • Comportamiento inadecuado en equals/toString.

Caso positivo

Se usa data object para estados de carga, la igualdad y la impresión se llevan a cabo según las reglas esperadas de data class. El modelo de capa utiliza de manera confiable el pattern matching en los estados.

Ventajas:

  • Correcta generación de métodos multimedia.
  • Comparación segura y diagnóstico.

Desventajas:

  • El data object solo apareció en nuevas versiones de Kotlin, lo que conlleva un riesgo de incompatibilidad con proyectos antiguos.