třídy jsme již viděli v dřívějším článku, ale datové třídy jdou trochu dále a pomáhají nám zjednodušit náš kód.
co jsou datové třídy?
datová třída je třída, která obsahuje pouze stav a neprovádí žádnou operaci.
výhodou použití datových tříd namísto běžných tříd je to, že Kotlin nám dává obrovské množství samo-generovaného kódu.
zejména nám to vše dává zdarma:
- vlastnosti deklarované v konstruktoru: to technicky není výlučné pro datovou třídu, ale kromě konstruktoru se vyhýbá všem kotlům getterů a setterů.
-
equals()
/hashCode()
- sada funkcí s názvem
componentX()
, které nám umožňují udělat skvělou věc, kterou uvidíme později. - a
copy()
metoda, velmi užitečná, když používáme neměnné objekty.
¿jak je Java kód ve srovnání s datovou třídou?
zde přichází úžasnost. Ačkoli téměř celý tento kód je generován IDE, v Javě to potřebujeme k implementaci datové třídy:
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 + ''' + '}'; }}
a stále bychom nebyli daleko od dosažení stejného množství funkcí, které Kotlin poskytuje s touto linkou:
data class Person(var name: String, var surname: String, var id: String)
tady opravdu vidíme Kotlinův potenciál, v množství zbytečného kódu, který nás zachrání.
třídy destrukce
to je použití funkcí componentX
. Díky nim můžete rozložit datovou třídu v proměnných tímto způsobem:
chcete se naučit Kotlin?
podívejte se na můj bezplatný průvodce a vytvořte svůj první projekt za 15 minut!
val person = Person("x", "y", "z")val (n, s, i) = person
díky tomu můžete dělat věci, jako je rozkládání párů map uvnitř smyčky:
val map = mapOf(1 to "a", 2 to "b")for ((key, value) in map) { toast("key: $key, value: $value")}
objekty copy
jak jsme již mluvili, je to pro nás dobrá praxe neměnnost ve všech možných situacích. Pokud implementujeme předchozí třídu jako neměnnou:
data class Person(val name: String, val surname: String, val id: String)
Pokud nyní budeme chtít změnit příjmení, nebudeme moci.
když pracujete s neměnností, Chcete-li změnit stav objektu, musíte jej zkopírovat s novou hodnotou. A to je použití funkce copy
:
val person = Person("John", "Smith", "123abc")val person2 = person.copy(surname="Rogers")
funkce copy
může přijímat tolik parametrů, kolik je třeba změnit. Jak vidíte, parametry funkce lze pojmenovat, takže můžete určit, které z nich chcete upravit.
závěr
datové třídy šetří spoustu kotle, které nás Java nutí generovat, takže skončíte s kódem, který je snáze pochopitelný a udržovatelný.
pokud se vám líbí to, co jste viděli, doporučuji vám, abyste se zaregistrovali na mé bezplatné školení, kde vám řeknu vše, co potřebujete, abyste se dozvěděli o tom, jak vytvořit vlastní aplikace pro Android v Kotlinu od nuly.