já vimos as classes em um artigo anterior, mas as classes de dados vão um pouco mais longe para nos ajudar a simplificar nosso código.
- o que são classes de dados?
- ¿como o código Java é comparado a uma classe de dados?Aqui vem a grandiosidade. Apesar de quase todo este código é gerado pelo IDE, em Java, precisamos disso para implementar uma classe de dados: public class Person { private String name; private String surname; private String id; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } public String getId() { return id; } public void setId(String id) { this.id = id; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (name != null ? !name.equals(person.name) : person.name != null) return false; if (surname != null ? !surname.equals(person.surname) : person.surname != null) return false; return id != null ? id.equals(person.id) : person.id == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (surname != null ? surname.hashCode() : 0); result = 31 * result + (id != null ? id.hashCode() : 0); return result; } @Override public String toString() { return "Person{" + "name='" + name + ''' + ", surname='" + surname + ''' + ", + id + ''' + '}'; }}
- classes desestruturando
- Objetos de cópia
- conclusão
o que são classes de dados?
uma classe de dados é uma classe que contém apenas estado e não executa nenhuma operação.
a vantagem de usar classes de dados em vez de classes regulares é que Kotlin nos dá uma imensa quantidade de código auto-gerado.
em particular, nos dá tudo isso de graça:
- As propriedades declaradas no construtor: este tecnicamente, não é exclusivo de uma classe de dados, mas ele evita todo o clichê de getters e setters, além de construtor.
-
equals()
/hashCode()
- um conjunto de funções chamado
componentX()
, que nos permite fazer uma coisa legal que veremos mais tarde. - um método
copy()
, muito útil quando usamos objetos imutáveis.
¿como o código Java é comparado a uma classe de dados?Aqui vem a grandiosidade. Apesar de quase todo este código é gerado pelo IDE, em Java, precisamos disso para implementar uma classe de dados:
public class Person { private String name; private String surname; private String id; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } public String getId() { return id; } public void setId(String id) { this.id = id; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (name != null ? !name.equals(person.name) : person.name != null) return false; if (surname != null ? !surname.equals(person.surname) : person.surname != null) return false; return id != null ? id.equals(person.id) : person.id == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + (surname != null ? surname.hashCode() : 0); result = 31 * result + (id != null ? id.hashCode() : 0); return result; } @Override public String toString() { return "Person{" + "name='" + name + ''' + ", surname='" + surname + ''' + ", + id + ''' + '}'; }}
E ainda estaríamos longe de alcançar a mesma quantidade de funcionalidades que Kotlin fornece com esta linha:
data class Person(var name: String, var surname: String, var id: String)
Este é o lugar onde nós realmente ver Kotlin potencial, no montante de inútil código que nos salva.
classes desestruturando
esse é o uso de componentX
funções. Graças a eles, você pode decompor uma classe de dados em variáveis dessa maneira:
Quer aprender Kotlin?
confira meu guia gratuito para criar seu primeiro projeto em 15 minutos!
val person = Person("x", "y", "z")val (n, s, i) = person
Graças a isso, você pode fazer coisas como a decomposição do mapa de pares dentro de um loop:
val map = mapOf(1 to "a", 2 to "b")for ((key, value) in map) { toast("key: $key, value: $value")}
Objetos de cópia
Como já falei antes, é uma boa prática para nós imutabilidade em todas as situações possíveis. Se implementarmos a classe anterior como imutável:
data class Person(val name: String, val surname: String, val id: String)
se agora quisermos mudar o sobrenome, não poderemos.
Quando você trabalha com imutabilidade, para alterar o estado de um objeto, você precisa copiá-lo com o novo valor. E esse é o uso da função copy
:
val person = Person("John", "Smith", "123abc")val person2 = person.copy(surname="Rogers")
a função copy
pode receber tantos parâmetros quanto os valores que você precisa alterar. Como você pode ver, os parâmetros da função podem ser nomeados, para que você possa especificar quais deseja modificar.
conclusão
classes de dados salva um monte de clichê que Java nos obriga a gerar, então você acaba com um código que é mais fácil de entender e manter.
se você gosta do que viu, encorajo você a se inscrever no meu treinamento gratuito, onde contarei tudo o que precisa para aprender sobre como criar seus próprios aplicativos Android no Kotlin do zero.