data class em Kotlin — o que é, sintaxe e características das classes de dados

Autor: IT Sectr Publicado: 2026-06-20 Tempo de leitura: 10 min

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 — palavra-chave para declarar uma classe de dados em Kotlin
  • equals e hashCode — gerados automaticamente com base em todas as propriedades do construtor primário
  • copy — função de cópia superficial com possibilidade de substituir campos individuais
  • componentN — desestruturação de data class em variáveis separadas
  • O construtor primário deve conter pelo menos um parâmetro val ou var

O que é um data class em Kotlin?

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.

Sintaxe e recursos básicos

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.

kotlin
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.

Propriedades fora do construtor primário

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.

kotlin
data class Product(
    val id: Int,
    val title: String
) {
    var cachedPrice: Double = 0.0
    // cachedPrice is NOT included in equals/hashCode/copy
}

Limitações do construtor primário

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.

Métodos automáticos equals, hashCode e toString

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.

equals para comparação de valor

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.

kotlin
data class Address(
    val city: String,
    val street: String
)

val a1 = Address("Moscow", "Tverskaya")
val a2 = Address("Moscow", "Tverskaya")
println(a1 == a2)  // true

toString para depuração

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.

Função copy e desestruturação

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.

kotlin
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.

Desestruturação via componentN

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.

kotlin
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.

Limitações e recomendaçõ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

Um data class pode herdar de outro data class?

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.

Quantas propriedades devem estar no construtor primário?

Pelo menos uma propriedade. O número máximo não é limitado, mas componentN é gerado para desestruturação.

As propriedades do corpo da classe afetam equals?

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.

Posso sobrescrever os métodos automáticos manualmente?

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.

Como data class difere de uma classe regular?

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

  • data class — construção sintática do Kotlin para armazenar dados com métodos auto-gerados
  • equals e hashCode — comparação estrutural baseada em propriedades do construtor primário
  • toString — representação legível do objeto para depuração e registro
  • copy — cópia superficial com substituição de campos individuais por argumentos nomeados
  • componentN — desestruturação de objetos em variáveis para trabalho conveniente com coleções
  • Limitações — final por padrão, pelo menos uma propriedade, sem herança data->data
  • Uso — DTO, modelos de API, objetos de valor, estado em MVVM

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.

Discutir o projeto

Leia também