vi har redan sett klasserna i en tidigare artikel, men dataklasser går lite längre för att hjälpa oss att förenkla vår kod.
vad är dataklasser?
en dataklass är en klass som bara innehåller tillstånd och inte utför någon åtgärd.
fördelen med att använda dataklasser istället för vanliga klasser är att Kotlin ger oss en enorm mängd självgenererad kod.
i synnerhet ger det oss allt detta gratis:
- de egenskaper som deklareras i konstruktören: detta är tekniskt inte exklusivt för en dataklass, men det undviker all pannplatta för getters och setters, förutom konstruktören.
-
equals()
/hashCode()
- en uppsättning funktioner som heter
componentX()
, som gör att vi kan göra en cool sak vi får se senare. - en
copy()
metod, mycket användbar när vi använder oföränderliga objekt.
¿hur är Java-kod jämfört med en dataklass?
här kommer awesomeness. Även om nästan all denna kod genereras av IDE, behöver vi i Java detta för att implementera en dataklass:
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 + ''' + '}'; }}
och vi skulle fortfarande vara långt ifrån att uppnå samma mängd funktionalitet som Kotlin tillhandahåller med denna linje:
data class Person(var name: String, var surname: String, var id: String)
det är här vi verkligen ser Kotlins potential, i mängden värdelös kod som sparar oss.
klasser destructuring
det är användningen av componentX
funktioner. Tack vare dem kan du sönderdela en dataklass i variabler på detta sätt:
vill du lära dig Kotlin?
kolla min gratis guide för att skapa ditt första projekt på 15 minuter!
val person = Person("x", "y", "z")val (n, s, i) = person
tack vare detta kan du göra saker som att sönderdela kartpar i en slinga:
val map = mapOf(1 to "a", 2 to "b")for ((key, value) in map) { toast("key: $key, value: $value")}
objekt kopiera
som vi har talat tidigare, det är en god praxis för oss oföränderlighet i alla möjliga situationer. Om vi implementerar tidigare klass som oföränderlig:
data class Person(val name: String, val surname: String, val id: String)
om vi nu vill ändra efternamnet kommer vi inte att kunna.
när du arbetar med oföränderlighet, för att ändra tillståndet för ett objekt måste du kopiera det med det nya värdet. Och det är användningen av copy
funktion:
val person = Person("John", "Smith", "123abc")val person2 = person.copy(surname="Rogers")
funktionen copy
kan ta emot så många parametrar som värden du behöver ändra. Som du kan se kan funktionsparametrar namnges, så du kan ange vilka du vill ändra.
slutsats
dataklasser sparar mycket standardtext som Java tvingar oss att generera, så du får en kod som är lättare att förstå och underhålla.
om du gillar vad du har sett uppmuntrar jag dig att registrera dig för min gratis träning, där jag berättar allt du behöver för att lära dig om hur du skapar dina egna Android-appar i Kotlin från början.