widzieliśmy już klasy we wcześniejszym artykule, ale Klasy danych posuwają się nieco dalej, pomagając nam uprościć nasz kod.
czym są Klasy danych?
Klasa danych jest klasą, która zawiera tylko stan i nie wykonuje żadnej operacji.
zaletą używania klas danych zamiast zwykłych jest to, że Kotlin daje nam ogromną ilość samodzielnie wygenerowanego kodu.
w szczególności daje nam to wszystko za darmo:
- właściwości zadeklarowane w konstruktorze: to technicznie nie jest wyłączne dla klasy danych, ale unika wszystkich kotłów getterów i seterów, oprócz konstruktora.
-
equals()
/hashCode()
- zestaw funkcji o nazwie
componentX()
, które pozwalają nam zrobić fajną rzecz, którą zobaczymy później. - a
copy()
metoda, bardzo przydatna, gdy używamy niezmiennych obiektów.
¿jak kod Java jest porównywany do klasy danych?
nadchodzi awesomeness. Chociaż prawie cały ten kod jest generowany przez IDE, w Javie potrzebujemy go do implementacji klasy danych:
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 + ''' + '}'; }}
i nadal bylibyśmy daleko od osiągnięcia takiej samej funkcjonalności, jaką Kotlin zapewnia w tej linii:
data class Person(var name: String, var surname: String, var id: String)
tutaj widzimy potencjał Kotlina, w ilości bezużytecznego kodu, który nas ratuje.
destrukcja klas
to użycie funkcji componentX
. Dzięki nim można w ten sposób rozkładać klasę danych w zmienne:
chcesz nauczyć się języka Kotlin?
Sprawdź mój darmowy przewodnik, aby stworzyć swój pierwszy projekt w 15 minut!
val person = Person("x", "y", "z")val (n, s, i) = person
dzięki temu możesz robić takie rzeczy jak rozkładanie par map wewnątrz pętli:
val map = mapOf(1 to "a", 2 to "b")for ((key, value) in map) { toast("key: $key, value: $value")}
kopiowanie obiektów
jak już wcześniej mówiliśmy, jest to dla nas dobra praktyka niezmienności w każdej możliwej sytuacji. Jeśli zaimplementujemy poprzednią klasę jako niezmienną:
data class Person(val name: String, val surname: String, val id: String)
jeśli teraz chcemy zmienić nazwisko, nie będziemy mogli.
podczas pracy z niezmiennością, aby zmienić stan obiektu, musisz skopiować go z nową wartością. I to jest użycie funkcji copy
:
val person = Person("John", "Smith", "123abc")val person2 = person.copy(surname="Rogers")
funkcja copy
może otrzymać tyle parametrów, ile wartości trzeba zmienić. Jak widać, parametry funkcji mogą być nazwane, więc możesz określić, które z nich chcesz zmodyfikować.
podsumowanie
klasy danych oszczędzają wiele boilerplate ’ ów, które Java zmusza nas do generowania, dzięki czemu otrzymujesz kod, który jest łatwiejszy do zrozumienia i utrzymania.
Jeśli podoba Ci się to, co widziałeś, zachęcam do zapisania się na moje bezpłatne szkolenie, na którym opowiem Ci wszystko, czego potrzebujesz, aby dowiedzieć się, jak tworzyć własne aplikacje na Androida w Kotlinie od podstaw.