data class en Kotlin es un tipo especial de clase diseñado exclusivamente para almacenar datos. El compilador genera automáticamente los métodos equals, hashCode, toString, copy y componentN basándose en las propiedades especificadas en el constructor primario. Según la documentación de JetBrains (2026), data class permite reducir el código repetitivo en un 50–70% en comparación con los equivalentes en Java y es la base para objetos de valor en proyectos Kotlin.
Puntos clave
data class es una construcción sintáctica de Kotlin que genera automáticamente métodos estándar para clases cuyo propósito principal es almacenar datos. Al declarar un data class, el compilador crea implementaciones de equals, hashCode, toString, copy y componentN basándose en todas las propiedades del constructor primario.
A diferencia de las clases regulares en Java, donde el desarrollador tiene que escribir manualmente getters, setters, equals, hashCode y toString usando IDE o bibliotecas como Lombok, Kotlin proporciona un mecanismo integrado. Esto no solo reduce el código sino que también garantiza consistencia: los métodos automáticos siempre corresponden a la estructura actual de propiedades.
Según la Encuesta Kotlin de JetBrains (2025), data class se utiliza en el 78% de los proyectos Kotlin, lo que lo convierte en una de las características más demandadas del lenguaje. Es especialmente popular en arquitecturas con DTO, modelos de respuesta API y objetos de estado en MVVM.
data class se declara con la palabra clave data antes de class. Todas las propiedades que participan en los métodos automáticos se especifican en el constructor primario.
data class User(
val id: Int,
val name: String,
val email: String
)
Una línea de código reemplaza docenas de líneas repetitivas en Java. El compilador genera equals, hashCode, toString, copy y component1–component3 para las tres propiedades.
Los métodos automáticos incluyen solo las propiedades del constructor primario. Si se declara una propiedad en el cuerpo de la clase, no participa en equals, hashCode, toString y copy.
data class Product(
val id: Int,
val title: String
) {
var cachedPrice: Double = 0.0
// cachedPrice is NOT included in equals/hashCode/copy
}
El constructor primario de un data class debe contener al menos un parámetro. Todos los parámetros deben estar marcados como val o var. No se pueden usar modificadores open, abstract, sealed o inner para un data class.
equals y hashCode se generan basándose en los valores de todas las propiedades del constructor primario. Dos instancias de un data class se consideran iguales si todas sus propiedades correspondientes son iguales.
En Java, la comparación de objetos por defecto es la comparación de referencias (==). La comparación por valor requiere sobrescribir equals. Kotlin data class hace esto automáticamente, permitiendo usar == para comparación estructural.
data class Address(
val city: String,
val street: String
)
val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2) // true
El método toString devuelve una representación legible del objeto con nombres y valores de todas las propiedades. Esto simplifica significativamente el registro y la depuración en comparación con Java, donde la salida predeterminada muestra el código hash en formato hexadecimal.
Según la Documentación de Kotlin (2026), toString de un data class tiene el formato: “User(id=1, name=John, email=john@example.com)”. Al eliminar propiedades del constructor primario, toString se actualiza automáticamente — el riesgo de desincronización se elimina.
copy es una de las características clave de data class. Crea una copia superficial del objeto con la posibilidad de cambiar los valores de propiedades especificadas.
data class Order(
val id: Long,
val status: String,
val amount: Double
)
val order = Order(1L, "Pending", 299.99)
val updatedOrder = order.copy(status = "Confirmed")
// updatedOrder.id = 1L, amount = 299.99, status = "Confirmed"
copy es indispensable en el estilo funcional y arquitecturas con inmutabilidad. En lugar de mutar un objeto existente, se crea una nueva copia con campos modificados, lo que hace que el código sea más predecible y seguro en escenarios multihilo.
data class genera automáticamente las funciones component1, component2 y así sucesivamente para cada propiedad en el orden en que se declaran. Esto permite desestructurar el objeto en variables.
val user = User(1, "Alice", "alice@example.com")
val (id, name, email) = user
println("$id: $name ($email)") // "1: Alice (alice@example.com)"
La desestructuración también funciona en lambdas y bucles for-each, lo que hace que data class sea conveniente para trabajar con colecciones.
La primera limitación — data class no admite herencia de otro data class. Solo se puede heredar de clases regulares o interfaces.
La segunda — los métodos automáticos incluyen solo las propiedades del constructor primario. Las propiedades en el cuerpo de la clase se ignoran, lo que puede llevar a un equals incorrecto si olvida esto.
La tercera — data class no puede ser open, abstract, sealed o inner. Siempre es final.
La cuarta — para colecciones dentro de un data class, copy realiza una copia superficial. Cambiar elementos dentro de la colección copiada afectará al original.
Según las Mejores Prácticas de Kotlin (2026), data class es óptimo para DTO, modelos API, objetos de valor y objetos de estado. Para componentes con lógica de negocio, se recomienda usar clases regulares.
Preguntas Frecuentes
No, un data class no puede heredar de otro data class. Sin embargo, puede heredar de una clase regular o implementar interfaces.
Al menos una propiedad. El número máximo no está limitado, pero componentN se genera para desestructuración.
No, los métodos automáticos solo consideran las propiedades del constructor primario. Las propiedades del cuerpo de la clase no participan en equals, hashCode, toString y copy.
Sí, usted puede sobrescribir equals, hashCode o toString en el cuerpo del data class. En este caso, el compilador no genera su propia implementación.
Un data class genera automáticamente equals, hashCode, toString, copy y componentN. Una clase regular no proporciona estos métodos sin implementación manual.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también