O que é data class em Kotlin? Diferença entre class e data class e quando usar no Kotlin

alex.vieira
alex.vieira

Compartilhe

Avalie este artigo

6 minutos de leitura

Quando falamos sobre data class em Kotlin, muitas pessoas buscam entender qual é a diferença entre class e data class, sua função, exemplos práticos e quando usar uma data class Kotlin.

De fato, a linguagem Kotlin incentiva códigos mais concisos em relação ao Java, e essa característica aparece claramente na forma como trabalhamos com classes de dados. 

Por ser uma linguagem relativamente nova, é comum surgirem afirmações imprecisas, especialmente ao compará-la com outras linguagens. 

Neste artigo, abordarei um tema bastante recorrente na comunidade, mas frequentemente mal compreendido: o famoso “Data Class”. 

O que muitos dizem... 

Geralmente, afirma-se que basta criar um Data Class para representar um POJO de forma concisa. Veja um exemplo: 

data class Pessoa( 
    val nome: String, 
    val idade: Int)

O código é bem mais enxuto do que um exemplo equivalente em Java. Ao criar uma pessoa a partir dessa classe, teríamos: 

val joao = Pessoa("João da Silva", 28) 

Repare que já envio o nome e idade via construtor. A princípio, nenhuma novidade, porém, e se tentarmos criar uma pessoa sem enviar os argumentos do construtor? 

Até aqui, nada de novo. Mas o que acontece se tentarmos criar uma pessoa sem passar argumentos para o construtor? 

val joao = Pessoa("João da Silva", 28) 
val maria = Pessoa()

Observe que esse código não compila. Você pode pensar: 

“Isso acontece, pois estamos trabalhando com properties val que precisam ser inicializadas!” 

Esse pode ser um motivo, mas, mesmo alterando para properties mutáveis: 

data class Pessoa( 
    var nome: String, 
    var idade: Int)

Ainda assim, o construtor vazio não irá funcionar, já que o Kotlin exige que todas as variáveis ou propriedades sejam inicializadas por padrão. Portanto, declarar um Data Class não significa automaticamente que se está criando um POJO. 

Banner da Alura convidando profissionais a desenvolver habilidades em inteligência artificial para acompanhar as transformações do mercado de tecnologia. A campanha destaca que quem utiliza IA produz mais, cresce na carreira e se torna mais competitivo, reforçando que a inteligência artificial deixou de ser tendência e passou a ser uma habilidade essencial. O banner incentiva a começar a aprender IA com os cursos da Alura e impulsionar a transformação digital.

Criando construtor vazio ao inicializar properties 

Para contornar essa situação e criar construtores padrão em data class Kotlin, podemos inicializar as propriedades com valores padrão, facilitando a criação de objetos vazios ou padrão. 

data class Pessoa( 
    var nome: String = "", 
    var idade: Int = 0)

Assim, podemos criar um objeto representando Maria sem nenhum problema: 

val joao = Pessoa("João da Silva", 28) 
val maria = Pessoa() 
maria.nome = "Maria da Silva" 
maria.idade = 28

Em resumo, para manter o comportamento semelhante ao de um POJO em Kotlin, precisamos definir valores padrão para as propriedades. Surge então uma nova dúvida: 

“Precisamos mesmo de um Data Class para definir um POJO?” 

Criando o real POJO 

Pode parecer estranho, mas se removemos a keyword data

 KOTLIN  

class Pessoa( 
    var nome: String = "", 
    var idade: Int = 0)

O código, além de compilar, funciona perfeitamente. Portanto, se a sua ideia é criar apenas um objeto simples (POJO), usar class comum pode ser suficiente. Mas então, para que serve a data class em Kotlin e quando usar data class Kotlin de fato? Veja a seguir. 

“Então, para que serve o Data Class?” 

A principal diferença entre class e data class em Kotlin é que a data class fornece implementações prontas para métodos como equals(), hashCode(), toString(), copy() e componentN(). Ou seja, usar uma data class Kotlin é recomendado quando você precisa desses comportamentos diretamente ligados aos dados. 

Além do construtor primário, somos capazes de utilizar um construtor secundário nas classes do Kotlin, esse assunto eu abordo com bastante detalhe no meu curso de Android com Kotlin. 

Quando utilizamos um Data Class, o Kotlin gera automaticamente as seguintes funções: 

  • equals()/hashCode(): para comparação de objetos; 
  • toString(): impressão padrão no formato "Pessoa(nome=João da Silva, idade=28)"; 
  • componentN(): para permitir o uso do Destructuring Declaration
  • copy(): para copiar o objeto com flexibilidade. 

Aproveitando a menção dessas funções, vamos explorar como cada uma delas funciona. 

Comparando os objetos 

Muita gente busca 'comparar objetos Kotlin' e a data class ajuda muito nesse ponto. Para testarmos o comportamento de comparação, vamos criar um clone do João da Silva e realizar um print: 

val joao = Pessoa("João da Silva", 28) 
val cloneDoJoao = Pessoa("João da Silva", 28) 
print(joao == cloneDoJoao)

Diferentemente de usar um equals(), estou usando o operador ==, que é traduzido como equals(). Isso é possível devido ao Operator Overloading. Vou deixar esse assunto para um outro momento. 

O resultado desse código é true, portanto, a comparação entre os objetos está sendo feita a partir das suas properties! 

Imprimindo os objetos do Data Class 

Agora vamos ver o toString() da Maria: 

val maria = Pessoa() 
maria.nome = "Maria da Silva" 
maria.idade = 28 
print(maria)

Ao testar o código, temos o seguinte resultado: 

Pessoa(nome=Maria da Silva, idade=28) 

Pegando as properties em variáveis separadas 

Com a implementação do componentN(), podemos utilizar o recurso de destructuring Kotlin (desestruturar objeto Kotlin), declarando variáveis a partir das propriedades do objeto de forma muito simples: 

val (nome, idade) = maria 

Assim, as variáveis nome e idade recebem cópias dos valores das propriedades do objeto maria

Copiando objetos 

Por fim, se Maria tiver uma irmã gêmea, podemos copiar a idade de Maria e alterar apenas o nome para representar a irmã: 

val maria = Pessoa() 
maria.nome = "Maria da Silva" 
maria.idade = 28 
val julia = maria.copy("Julia da Silva") 
print(julia)

Ao testar o código, temos o seguinte resultado: 

Pessoa(nome=Julia da Silva, idade=28) 

Curiosidade sobre a imutábilidade 

Embora o artigo demonstre o uso de var (properties mutáveis) em data classes, as boas práticas atuais de Kotlin (2026) recomendam fortemente o uso de val (properties imutáveis) em data classes.  

Segundo artigos recentes de março de 2026, usar var pode causar comportamento imprevisível quando objetos são usados em coleções como HashSet ou como chaves de mapas, pois o hashCode pode mudar após modificações. A função copy() oferece uma alternativa segura para criar novas instâncias com valores modificados, mantendo a imutabilidade. 

Resumindo 

Ao entender o que é data class Kotlin, quando usar data class Kotlin, diferença entre class e data class, exemplos de data class Kotlin e seus principais recursos, fica claro que a escolha depende da necessidade dos métodos adicionais oferecidos (comparação, cópia, destructuring).

Use data class em Kotlin sempre que precisar desses recursos implementados automaticamente. 

É válido lembrar que ambas as funções funcionam apenas para properties do construtor primário, ou seja, as demais properties da classe, como, por exemplo, no corpo dela, não serão consideradas. 

Agora que conhece o Data Class, o que achou da proposta dele? Compartilhe comigo nos comentários. 

Se você quer aprender mais sobre data class, classes, ou avançar em programação Kotlin, confira nossas trilhas de cursos e formação Android com Kotlin. Veja também outros artigos relacionados: 

Avalie este artigo

Veja outros artigos sobre Back-end

Estude 2 anos por R$ 158/mês. Planos com até 35% OFF. Ver planos.