Abbiamo già visto le classi in un articolo precedente, ma le classi di dati vanno un po ‘ oltre nell’aiutarci a semplificare il nostro codice.
Cosa sono le classi di dati?
Una classe di dati è una classe che contiene solo lo stato e non esegue alcuna operazione.
Il vantaggio di utilizzare classi di dati invece di classi regolari è che Kotlin ci dà un’immensa quantità di codice auto-generato.
In particolare, ci dà tutto questo gratuitamente:
- Le proprietà dichiarate nel costruttore: questo tecnicamente non è esclusivo di una classe di dati, ma evita tutto il boilerplate di getter e setter, oltre al costruttore.
-
equals()
/hashCode()
- Un insieme di funzioni chiamate
componentX()
, che ci permettono di fare una cosa interessante che vedremo più avanti. - Un metodo
copy()
, molto utile quando usiamo oggetti immutabili.
¿Come viene confrontato il codice Java con una classe di dati?
Ecco che arriva la suggestione. Anche se la quasi totalità di questo codice è generato dall’IDE, in Java che abbiamo bisogno di questo per implementare una classe di dati:
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 saremmo ancora lontani dal raggiungere la stessa quantità di funzionalità che Kotlin fornisce con questa linea:
data class Person(var name: String, var surname: String, var id: String)
Questo è dove abbiamo davvero vedere Kotlin del potenziale, la quantità di codice inutile che ci salva.
Classi destrutturazione
Questo è l’uso di componentX
funzioni. Grazie a loro, puoi scomporre una classe di dati in variabili in questo modo:
Vuoi imparare Kotlin?
Controlla la mia guida gratuita per creare il tuo primo progetto in 15 minuti!
val person = Person("x", "y", "z")val (n, s, i) = person
Grazie a questo, si possono fare cose come la decomposizione mappa coppie all’interno di un ciclo:
val map = mapOf(1 to "a", 2 to "b")for ((key, value) in map) { toast("key: $key, value: $value")}
gli Oggetti di copia
Come abbiamo parlato prima, è una buona pratica per noi immutabilità in tutte le situazioni possibili. Se implementiamo la classe precedente come immutabile:
data class Person(val name: String, val surname: String, val id: String)
Se ora vogliamo cambiare il cognome, non saremo in grado.
Quando si lavora con immutabilità, per modificare lo stato di un oggetto è necessario copiarlo con il nuovo valore. E questo è l’uso della funzione copy
:
val person = Person("John", "Smith", "123abc")val person2 = person.copy(surname="Rogers")
La funzione copy
può ricevere tanti parametri quanti sono i valori da modificare. Come puoi vedere, i parametri di funzione possono essere nominati, quindi puoi specificare quali vuoi modificare.
Conclusione
le classi di dati risparmiano un sacco di boilerplate che Java ci costringe a generare, quindi si finisce con un codice che è più facile da capire e da mantenere.
Se ti piace quello che hai visto, vi incoraggio a firmare per la mia formazione gratuita, dove ti dirò tutto il necessario per imparare su come creare le proprie applicazioni Android in Kotlin da zero.