Classes de dados em Kotlin
1. Visão geral
A linguagem Kotlin introduz o conceito de Classes de dados, que representam classes simples usadas como contêineres de dados e não encapsulam nenhuma lógica adicional. Simplificando, a solução de Kotlin nos permite evitar escrever muitos códigos clichê.
Neste artigo rápido, vamos dar uma olhada nas classes de dados em Kotlin e compará-las com suas contrapartes Java.
2. Configuração Kotlin
Para começar a configurar o projeto Kotlin, verifique nosso tutorialintroduction to the Kotlin Language.
3. Classes de dados em Java
Se quiséssemos criar uma entradaMovie em Java, precisaríamos escrever muito código clichê:
public class Movie {
private String name;
private String studio;
private float rating;
public Movie(String name, String studio, float rating) {
this.name = name;
this.studio = studio;
this.rating = rating;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStudio() {
return studio;
}
public void setStudio(String studio) {
this.studio = studio;
}
public float getRating() {
return rating;
}
public void setRating(float rating) {
this.rating = rating;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + Float.floatToIntBits(rating);
result = prime * result + ((studio == null) ? 0 : studio.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Movie other = (Movie) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (Float.floatToIntBits(rating) != Float.floatToIntBits(other.rating))
return false;
if (studio == null) {
if (other.studio != null)
return false;
} else if (!studio.equals(other.studio))
return false;
return true;
}
@Override
public String toString() {
return "Movie [name=" + name + ", studio=" + studio + ", rating=" + rating + "]";
}
}
86 linhas de código. Isso é muito para armazenar apenas três campos em uma classe simples.
4. Classe de dados Kotlin
Agora, vamos criarthe same Movie class, with the same functionalities, using Kotlin:
data class Movie(var name: String, var studio: String, var rating: Float)
Como podemos ver, isso é extremamente mais fácil e limpo. Construtor,toString(), equals(), hashCode(), funções adicionaiscopy()ecomponentN() são geradas automaticamente.
4.1. Uso
Uma classe de dados é instanciada da mesma maneira que outras classes:
val movie = Movie("Whiplash", "Sony Pictures", 8.5F)
Agora, as propriedades e funções de estão disponíveis:
println(movie.name) //Whiplash
println(movie.studio) //Sony Pictures
println(movie.rating) //8.5
movie.rating = 9F
println(movie.toString()) //Movie(name=Whiplash, studio=Sony Pictures, rating=9.0)
4.2. Função de cópia
A funçãocopy() é criada, caso seja necessário copiar um objeto alterando algumas de suas propriedades, mas mantendo as demais inalteradas.
val betterRating = movie.copy(rating = 9.5F)
println(betterRating.toString()) // Movie(name=Whiplash, studio=Sony Pictures, rating=9.5)
Java não fornece uma maneira nativa e clara para copiar / clonar objetos. Podemos usar a interfaceClonable,SerializationUtils.clone() ou acloning constructor.
4.3. Declarações de Destruturação
As declarações de reestruturação nos permitem tratar as propriedades dos objetos como valores individuais. Para cada propriedade em nossa classe de dados, umcomponentN() é gerado:
movie.component1() // name
movie.component2() // studio
movie.component3() // rating
Também podemos criar várias variáveis a partir do objeto ou diretamente de uma função - é importante lembrar sobre o uso de colchetes:
val(name, studio, rating) = movie
fun getMovieInfo() = movie
val(namef, studiof, ratingf) = getMovieInfo()
4.4. Requisitos de classe de dados
Para criar uma classe de dados, precisamos cumprir os seguintes requisitos:
-
O construtor primário precisa ter pelo menos um parâmetro
-
Todos os parâmetros do construtor primário precisam ser marcados comoval ouvar
-
As classes de dados não podem ser abstratas, abertas, seladas ou internas
-
(antes da versão 1.1.) As classes de dados podem implementar apenas interfaces
Desde 1.1, as classes de dados podem estender outras classes.
Se a classe gerada precisar ter um construtor sem parâmetros, os valores padrão para todas as propriedades deverão ser especificados:
data class Movie(var name: String = "", var studio: String = "", var rating: Float = 0F)
5. Conclusão
Vimos classes de dados em Kotlin, seu uso e requisitos, a quantidade reduzida de código clichê escrito e comparações com o mesmo código em Java.
Se você quiser saber mais sobre Kotlin, verifique artigos comoKotlin Java Interoperabilitye os já mencionadosIntroduction to the Kotlin Language.
A implementação completa desses exemplos pode ser encontrada em nossoGitHub project.