vi har allerede set klasserne i en tidligere artikel, men dataklasser går lidt længere for at hjælpe os med at forenkle vores kode.
hvad er dataklasser?
en dataklasse er en klasse, der kun indeholder tilstand og ikke udfører nogen handling.
fordelen ved at bruge dataklasser i stedet for almindelige klasser er, at Kotlin giver os en enorm mængde selvgenereret kode.
især giver det os alt dette gratis:
- de egenskaber, der er erklæret i konstruktøren: dette er teknisk set ikke eksklusivt for en dataklasse, men det undgår al kedelplade af getters og settere ud over konstruktøren.
-
equals()
/hashCode()
- et sæt funktioner kaldet
componentX()
, som giver os mulighed for at gøre en sej ting, vi ser senere. - en
copy()
metode, meget nyttig, når vi bruger uforanderlige objekter.
¿Hvordan sammenlignes Java-kode med en dataklasse?
her kommer det fantastiske. Selvom næsten al denne kode genereres af IDE, har vi i Java brug for dette for at implementere en dataklasse:
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 + ''' + '}'; }}
og vi ville stadig være langt fra at opnå den samme mængde funktionalitet, som Kotlin leverer med denne linje:
data class Person(var name: String, var surname: String, var id: String)
det er her, vi virkelig ser Kotlins potentiale i mængden af ubrugelig kode, der sparer os.
klasser destrukturering
det er brugen af componentX
funktioner. Takket være dem kan du nedbryde en dataklasse i variabler på denne måde:
vil du lære Kotlin?
tjek min gratis guide til at oprette dit første projekt på 15 minutter!
val person = Person("x", "y", "z")val (n, s, i) = person
takket være dette kan du gøre ting som at nedbryde kortpar inde i en løkke:
val map = mapOf(1 to "a", 2 to "b")for ((key, value) in map) { toast("key: $key, value: $value")}
objekter kopi
som vi har talt før, er det en god praksis for os uforanderlighed i alle mulige situationer. Hvis vi implementerer tidligere klasse som uforanderlig:
data class Person(val name: String, val surname: String, val id: String)
hvis vi nu vil ændre efternavnet, kan vi ikke.
når du arbejder med uforanderlighed, skal du kopiere det med den nye værdi for at ændre tilstanden for et objekt. Og det er brugen af copy
funktion:
val person = Person("John", "Smith", "123abc")val person2 = person.copy(surname="Rogers")
funktionen copy
kan modtage så mange parametre som værdier, du skal ændre. Som du kan se, kan funktionsparametre navngives, så du kan angive, hvilke du vil ændre.
konklusion
dataklasser sparer en masse kedelplade, som Java tvinger os til at generere, så du ender med en kode, der er lettere at forstå og vedligeholde.
hvis du kan lide det, du har set, opfordrer jeg dig til at tilmelde dig min gratis træning, hvor jeg fortæller dig alt hvad du har brug for for at lære om, hvordan du opretter dine egne Android-Apps i Kotlin fra bunden.