datové třídy je koncept, který není vázána na žádný konkrétní programovací jazyk, je to vzor, který je dostatečně pohodlné, aby většina programátorů jako jednoduchý způsob, jak reprezentovat, zapouzdření a přesunout informace.

datová třída označuje třídu, která obsahuje pouze pole a metody crud pro přístup k nim (gettery a settery). Jedná se jednoduše o kontejnery pro data používaná jinými třídami. Tyto třídy neobsahují žádné další funkce a nemohou samostatně pracovat s daty, která vlastní.

Obvykle, datové třídy reprezentují entity reálného světa, a je běžné mít desítky nebo stovky těchto tříd v projektu, což znamená, že vytváření, úprava a manipulace s těmito objekty, je to velmi časté úkol pro vývojáře.

Data třídy v jazyce Java

to je To, jak datové třídy obvykle vypadá v Javě:

všimněte Si, že jsme převažujícího toString() , equals() a hashCode() metody (deklarované v Object.java class ). Proč je přepsání těchto metod relevantní v datových třídách?

při implementaci těchto tří metod vytváříme hodnotové objekty, třídy, pro které jsou jakékoliv dvě instance s vhodně stejnými hodnotami polí považovány za zaměnitelné. (Poznámka: Chcete-li být zcela pravdivý, budeme muset udělat třídu neměnnou. Dokončení polí a odstranění nastavovačů pomáhá. Neměnnost je často považováno za dobrou praxi a doporučeno, když je to možné)

  • equals() : ve výchozím nastavení, vrátí true jen pokud obě proměnné odkazují na stejný objekt, tj. pokud pozice v paměti je stejný. Tuto metodu přepíšeme pro návrat true, pokud objekty obsahují stejné informace, jinými slovy, pokud objekty představují stejnou entitu. Kontroluje vlastnosti jsou stejné a obsahují stejnou hodnotu.
  • hashCode() : ve výchozím nastavení vrátí paměťovou adresu objektu v šestnáctkové soustavě. Jedná se o číselnou hodnotu pro identifikaci objektu během testování rovnosti, tj. stejné objekty mají stejný hash kód. Tato metoda musí být přepsána, když je toString() přepsána, takže vrací hash kód vypočtený z hodnot vlastností.
  • toString(): Ve výchozím nastavení vrátí typ objektu a hashCode(), například [email protected]+ . Tuto metodu přepíšeme, protože máme více čitelnou verzi objektu, jako je User(name=Steve, surname=Jobs) .

přestože je to tak důležitý koncept, v kódu Java výše není nic, co by tuto třídu odlišovalo od ostatních. Programátoři ji mohou rozpoznat jako datovou třídu kvůli struktuře a vzorům tříd, ale z hlediska kompilátoru je tato třída jen další třídou.

vytváření datových tříd je tak běžné, že vývojáři často používají IDE a další pluginy, které jim pomáhají s touto opakující se úlohou. Bolest při vytváření datové třídy v Javě může být zmírněna pluginy nebo IDE, ale většina chyb je zavedena při dalších úpravách těchto tříd. Je velmi snadné zapomenout upravit všechny doprovodné metody odpovídajícím způsobem pokaždé, když je pole odstraněno nebo přidáno.

datová třída v Javě postrádá jazykovou podporu. Je to opakující se a náchylný k chybám úkol, který představuje příliš mnoho tření pro moderní programovací jazyk.

data třídy v Kotlin

stejné třídy dat v Kotlin by to vypadat nějak takhle:

data class User(var name: String, var age: Int)

Kotlin zvyšuje údajů třídy, do první třídy občanů představujeme data klíčové slovo. Pojďme to rozebrat.

  • Getry a setry

getry a setry jsou vytvořeny automaticky v Kotlin, když jsme deklarovat vlastnosti. Stručně řečeno, to, co var name: String znamená, že User třída má vlastnost, která je veřejná (implicitní viditelnost v Kotlin), proměnlivý (var) a String typ. Vzhledem k tomu, že je veřejný, vytváří getter, a vzhledem k tomu, že je proměnlivý, vytváří Setra.

Pokud chceme, aby se třídy jen pro čtení (bez tvůrců), musíme použít val :

data class User(val name: String, val age: Int)

můžeme mix val a var ve stejné třídě prohlášení. val si můžete představit jako final proměnnou v Javě.

vše, co bylo dosud vysvětleno, je společné pro jakoukoli deklaraci třídy v Kotlinu, ale klíčové slovo data je to, co zde dělá rozdíl.

  • data klíčové slovo

deklaraci třídy jako třídy dat je nás realizován toString() , hashCode() a equals() automaticky stejným způsobem jsme popsali výše pro Java třídy. Takže pokud vytvoříme uživatelskou třídu jako User("Steve Jobs",56) a zavoláme metodu toString(), dostaneme něco jako:User(name=Steve Jobs, age=56) .

destrukční deklarace

Klíčové slovo data poskytuje funkce, které umožňují destrukční deklarace. Stručně řečeno, vytváří funkci pro každou vlastnost, takže můžeme dělat takové věci:

funkce Kopírování

Klíčové slovo data nám poskytuje praktický způsob kopírování tříd, které mění hodnotu některých vlastností. Chceme-li vytvořit kopii uživatelského změna věku, to je způsob, jak budeme dělat to:

Vlastnosti deklarované ve třídě tělo jsou ignorovány

kompilátor používá pouze vlastnosti, které jsou definované uvnitř primární konstruktor pro automaticky generované funkce.

vlastnost address nebude zpracována klíčovým slovem data, takže to znamená, že automaticky generované implementace ji budou ignorovat.

Spárovat a Triple

Pair a Triple jsou standardní datové třídy v knihovně, ale Kotina docs sami sebe odrazovat od využití z nich ve prospěch více čitelné a na míru vlastní data třídy.

požadavky a omezení

  • Konstruktor datové třídy musí mít alespoň jeden parametr.
  • všechny parametry musí být uváděny na trh jako val nebo var .
  • datová třída nemůže být abstract, open, sealed nebo inner .
  • equals , toString a hashCode metody lze explicitně přepsat.
  • explicitní implementace funkcí componentN() a copy() nejsou povoleny.
  • odvození datové třídy z typu s podpisem funkce copy() bylo v Kotlinu 1.2 zastaralé a v Kotlinu 1.3 bylo zakázáno.
  • třída data se nemůže rozšířit z jiné třídy data.
  • a data třída může rozšířit další třídy (od Kotlinu 1.1)

datové třídy jsou prvotřídní občané v kotlině. Ve velmi krátké syntaxi nabízejí řešení bez tření se všemi výhodami a bez kompromisů.

Co to znamená pro Android

pokusím se vysvětlit, co jsou hlavní výhody, které jsem našel pomocí Kotlin třídy dat v mé Android projektů. Nejsou to všechny a nemusí to být ty nejdůležitější, ale ty jsou z mé dosavadní zkušenosti nejzřetelnější.

  • Datové modely

Architektura v Android byl (a stále je) horké téma. Existuje několik možností, ale většina z nich má společné oddělení obav a zásady jednotné odpovědnosti. Čistá Architektura-velmi známý v Android komunitě – je soubor osvědčených postupů, které následují při míření pro dobrou architekturu, která klade důraz na použití různých modelů pro různé vrstvy architektury. To znamená, že projekt se 3 nebo 4 různými datovými modely se stává standardem.

Co to znamená, že počet datových tříd v projektu je velmi vysoká, a operace, jako je vytvářet, číst, upravovat, kopírovat, porovnávat, mapa… datový model tříd jsou denní úkoly, které těží z Kotina Data Třída auto-generovaný kód. Šetří obrovské množství času a snižuje možnosti zavádět chyby.

  • žádné další automatické hodnoty

použití typů hodnot je v Androidu velmi rozšířenou praxí, zejména mezi datovými třídami.

typ hodnoty je objekt z třídy neměnných hodnot.
třída hodnot je třída, pro kterou rovnost závisí na jejím obsahu.
neměnná třída je třída, kterou nelze po vytvoření změnit.

AutoValue je populární Knihovna od společnosti Google, která nám pomáhá vytvářet typy hodnot. Dělá svou práci, ale je velmi podrobná pro něco, co by nemělo být tak složité.

pomocí kotlin data tříd s val přístup modifikátor nám dostatečně blízko aproximaci hodnotových typů.

data class User(val name : String, val age : Int)

předchozí třída uživatelů je třída dostatečně blízko k hodnotovým typům, v mnohem kratší syntaxi. Pro dobrou část lidí může být AutoValue nahrazen Kotlinem. Méně kódu, žádné zpracování anotací a o jednu méně knihovny, na které je třeba záviset.

Poznámka: Kotlin nabízí vlastnosti a třídy pouze pro čtení s klíčovým slovem val. Pouze pro čtení a neměnnost není stejná (více zde), ale obecně je považována za dostatečně dobrou pro praktické účely.

  • více Lombok

Jeden ze způsobů, jak vývojáři se snažili ušetřit čas při jednání s třídy dat je pomocí knihovny pro generování getter a setter metody. Lombok je jedním z (v)slavných v Androidu / Javě. To vyžaduje nejen knihovnu, ale i plugin pro AS. Dlouhý příběh krátký, je pro většinu vývojářů Lombok přinášet tolik výhod jako bolesti hlavy, takže se stává, že knihovna začnete milující, ale po chvíli se nemůžete dočkat, jak se zbavit ale nikdy udělat, protože je všude.

vzhledem k tomu, že datové třídy Kotlin nevyžadují Ruční zápis metod getter/setter, hlavní potřeba Lomboku je pryč.

  • RecyclerView DiffUtil

RecyclerView v Androidu je widget. Je to v každé aplikaci na více obrazovkách. Jednou z důležitých součástí při implementaci adaptérů RecyclerView je třída DiffUtil. DiffUtil vypočítá rozdíl mezi dvěma seznamy, aby odeslal změny – pokud existují-do adaptéru. Je to mnohem efektivnější než osvěžení celého seznamu znovu a znovu a krásně oživuje změny.

DiffUtil se silně spoléhá na rovnost položek, což znamená, že dvě položky jsou stejné, pokud je jejich obsah stejný. Pokaždé, když používáte RecyclerView, měli byste používat DiffUtil, což znamená, že potřebujete způsob porovnání, pokud dva objekty obsahují stejné informace. To je jeden z důvodů, proč musíme přepsat equals v našich datových třídách Java, ale s třídami Kotlin data je to zdarma.

Poznámka: Pokud nejste seznámeni s DiffUtil zkontrolujte tento rychlý návod.

  • testy

v testovacích třídách neustále kontrolujeme, zda očekávané hodnoty odpovídají skutečným hodnotám. Porovnání rovnosti objektů (jak je popsáno výše) je velmi častým úkolem.

Dokonce i když nepotřebujete přepsat equals , toString a toHash triplet pro vás pravidelné app runtime, šance, že budete potřebovat k přepsání těchto metod pro účely testování jsou vysoké, takže Kotlin třídy dat jasnou cestu k testování se žádné výmluvy.

Dodatek

promluvme si o některých dalších běžných scénářích, které stojí za zmínku při práci s datovými třídami Kotlin. To není striktně spojeno s datovými třídami, ale je mezi nimi obzvláště běžné.

  • Více konstruktérů
data class User(val name : String, val age : Int)

V User třídu jsme definovali dříve, musíme explicitně zadat name a age při vytváření instance typu User("Steve", 56) .

V Kotlin můžeme definovat výchozí hodnoty pro argumenty takovým způsobem, že v případě, že nechceme, předejte hodnotu pro tento argument, výchozí hodnota je přiřazena.

data class User(val name : String, val age :Int = 0)

User("Steve", 56) je stále platný, ale nyní je povolen druhý Konstruktor User("Steve"). V takovém případě bude hodnota age 0.

můžeme přiřadit výchozí hodnoty obou parametrů umožňuje třetí konstruktor User(), kde name bude prázdný a age bude 0.

data class User(val name : String = "", val age : Int = 0)

takže nyní User(), User("Steve") a User("Steve",56) jsou všechny platné hovory.

to má určitá omezení: volitelné parametry musí být poslední parametry v konstruktoru. Další nebude kompilovat.

data class User(val name : String = "", val age : Int)
val user = User(56) // This doesn't compile

dalším omezením je, že pokud máme více volitelných parametrů, musí být přeskočeny zprava doleva.

data class User(
val name : String,
val surname : String = "",
val age : Int = 0
)User("Steve")
User("Steve", "Jobs")
User("Steve", "Jobs", 56)
User("Steve",56) // This wont compile

k řešení tohoto omezení Kotlin nabízí pojmenované argumenty. To nám umožňuje určit, ke kterému argumentu patří každá hodnota. Nyní můžeme dělat věci jakoUser(name = "Steve", age = 56) – nebo kratší User("Steve", age = 56) – kde bude příjmení přiřazeno výchozí hodnotě.

Výchozí argumenty a pojmenované argumenty jsou velmi užitečný způsob, jak nabídnout více konstruktérů a přetížení z velmi kompaktní prohlášení.

  • @JvmOverloads

vše vysvětleno v předchozím bodě nebere v úvahu volání ze strany Java. Kotlin je interoperabilní s Javou, takže musíme být schopni vytvořit instance třídy User z Javy.

pokud ji nebudete používat z Javy, máte hotovo, ale jinak budete potřebovat anotaci @JvmOverloads vzhledem k tomu, že Java nenabízí pojmenované argumenty.

data class User @JvmOverloads constructor(
val name : String,
val surname : String = "",
val age : Int = 0
)

co to dělá generování více konstruktorů, takže to může být voláno z Javy.

poznámka: je důležité si uvědomit, že nevytváří všechny možné permutace, ale ty, které jsou výsledkem odstranění volitelných argumentů zprava doleva. Více zde

  • stavitelé

vzhledem k tomu, že Kotlin nabízí pojmenované parametry a výchozí argumenty, je méně pravděpodobné, že je potřeba stavitelů. Na vrcholu se, že moderní Ide jako Android Studio již ukazují jméno parametru na volání straně usnadňuje čtení, takže je méně zajímavé jen pro čitelnost účely.

v případech, kdy je stále potřeba vzor stavitele. Kotlin nenabízí nic zvláštního, aby nám s tím pomohl. Stavitelský vzor V Kotlíně vypadá:

  • anotace

je velmi běžné, že některé třídy datového modelu používají zpracování anotací. Například modely API (datové třídy reprezentující deserializované odpovědi z API) jsou často anotovány anotacemi Gson nebo Moshi. Modely persistence (datové třídy reprezentující data uložená v lokálním úložišti / databázích) jsou často anotovány anotacemi místnosti nebo Říše.

v Kotlinu můžeme tyto anotace stále používat. Jedná se například o uživatelský model, který má být uložen v databázi místnosti:

shrnutí

datové třídy Kotlin jsou výsledkem let učení z bolesti a frustrace s datovými třídami v Javě. Jejich cílem je mít všechny výhody a žádné nevýhody. Jejich použití je velmi jednoduché a příjemné a jakmile si na to zvyknete, je velmi obtížné se ohlédnout.

v Androidu nám pomáhají různými způsoby, ale většinou šetří spoustu času a snižují chyby.

datová třída Kotlin je dobrým příkladem toho, co je Kotlin jako programovací jazyk: stručný, pragmatický a radost pro vývojáře.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.

lg