data class em Kotlin é um tipo especial de classe projetado exclusivamente para armazenar dados. O compilador gera automaticamente os métodos equals, hashCode, toString, copy e componentN com base nas propriedades especificadas no construtor primário. De acordo com a documentação da JetBrains (2026), data class permite reduzir o código boilerplate em 50–70% em comparação com equivalentes Java e é a base para objetos de valor em projetos Kotlin.
Pontos principais
data class é uma construção sintática do Kotlin que gera automaticamente métodos padrão para classes cujo objetivo principal é armazenar dados. Ao declarar um data class, o compilador cria implementações de equals, hashCode, toString, copy e componentN com base em todas as propriedades do construtor primário.
Ao contrário das classes regulares em Java, onde o desenvolvedor precisa escrever manualmente getters, setters, equals, hashCode e toString usando IDE ou bibliotecas como Lombok, Kotlin fornece um mecanismo embutido. Isso não apenas reduz o código, mas também garante consistência — os métodos automáticos sempre correspondem à estrutura atual de propriedades.
De acordo com a Pesquisa Kotlin da JetBrains (2025), data class é usado em 78% dos projetos Kotlin, tornando-se um dos recursos mais requisitados da linguagem. É especialmente popular em arquiteturas com DTO, modelos de resposta de API e objetos de estado em MVVM.
data class é declarado com a palavra-chave data antes de class. Todas as propriedades que participam dos métodos automáticos são especificadas no construtor primário.
data class User(
val id: Int,
val name: String,
val email: String
)
Uma linha de código substitui dezenas de linhas de boilerplate em Java. O compilador gera equals, hashCode, toString, copy e component1–component3 para todas as três propriedades.
Os métodos automáticos incluem apenas propriedades do construtor primário. Se uma propriedade for declarada no corpo da classe, ela não participa de equals, hashCode, toString e copy.
data class Product(
val id: Int,
val title: String
) {
var cachedPrice: Double = 0.0
// cachedPrice is NOT included in equals/hashCode/copy
}
O construtor primário de um data class deve conter pelo menos um parâmetro. Todos os parâmetros devem ser marcados como val ou var. Não é possível usar modificadores open, abstract, sealed ou inner para um data class.
equals e hashCode são gerados com base nos valores de todas as propriedades do construtor primário. Duas instâncias de um data class são consideradas iguais se todas as suas propriedades correspondentes forem iguais.
Em Java, a comparação de objetos por padrão é a comparação de referências (==). A comparação por valor requer a sobrescrita de equals. Kotlin data class faz isso automaticamente, permitindo usar == para comparação estrutural.
data class Address(
val city: String,
val street: String
)
val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2) // true
O método toString retorna uma representação legível do objeto com nomes e valores de todas as propriedades. Isso simplifica significativamente o registro e a depuração em comparação com Java, onde a saída padrão mostra o código hash em formato hexadecimal.
De acordo com a Documentação do Kotlin (2026), o toString de um data class tem o formato: “User(id=1, name=John, email=john@example.com)”. Ao remover propriedades do construtor primário, o toString é atualizado automaticamente — o risco de dessincronização é eliminado.
copy é um dos principais recursos do data class. Ela cria uma cópia superficial do objeto com a possibilidade de alterar valores de propriedades 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 é indispensável no estilo funcional e em arquiteturas com imutabilidade. Em vez de mutar um objeto existente, uma nova cópia é criada com campos modificados, tornando o código mais previsível e seguro em cenários multithread.
data class gera automaticamente as funções component1, component2 e assim por diante para cada propriedade na ordem em que são declaradas. Isso permite desestruturar o objeto em variáveis.
val user = User(1, "Alice", "alice@example.com")
val (id, name, email) = user
println("$id: $name ($email)") // "1: Alice (alice@example.com)"
A desestruturação também funciona em lambdas e loops for-each, tornando data class conveniente para trabalhar com coleções.
Primeira limitação — data class não suporta herança de outro data class. Só é possível herdar de classes regulares ou interfaces.
Segunda — os métodos automáticos incluem apenas propriedades do construtor primário. Propriedades no corpo da classe são ignoradas, o que pode levar a um equals incorreto se você esquecer disso.
Terceira — data class não pode ser open, abstract, sealed ou inner. Ele é sempre final.
Quarta — para coleções dentro de um data class, copy realiza cópia superficial. Alterar elementos dentro da coleção copiada afetará o original.
De acordo com as Melhores Práticas do Kotlin (2026), data class é ideal para DTO, modelos de API, objetos de valor e objetos de estado. Para componentes com lógica de negócios, recomenda-se usar classes regulares.
Perguntas Frequentes
Não, um data class não pode herdar de outro data class. No entanto, ele pode herdar de uma classe regular ou implementar interfaces.
Pelo menos uma propriedade. O número máximo não é limitado, mas componentN é gerado para desestruturação.
Não, os métodos automáticos consideram apenas as propriedades do construtor primário. Propriedades do corpo da classe não participam de equals, hashCode, toString e copy.
Sim, você pode sobrescrever equals, hashCode ou toString no corpo do data class. Neste caso, o compilador não gera sua própria implementação.
Um data class gera automaticamente equals, hashCode, toString, copy e componentN. Uma classe regular não fornece esses métodos sem implementação manual.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também