Classes de dados em Kotlin

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.