
az adatosztály olyan fogalom, amely nem kötődik semmilyen konkrét programozási nyelvhez, ez egy olyan minta, amely elég kényelmes a legtöbb programozó számára, mint egyszerű módja az információk ábrázolásának, beágyazásának és mozgatásának.
az adatosztály olyan osztályra utal, amely csak mezőket és crud metódusokat tartalmaz az azokhoz való hozzáféréshez (getterek és beállítók). Ezek egyszerűen tárolók más osztályok által használt adatokhoz. Ezek az osztályok nem tartalmaznak további funkciókat, és nem tudnak önállóan működni a saját adataikon.
az adatosztályok általában valós entitásokat képviselnek, és gyakori, hogy több tucat vagy száz ilyen osztály van egy projektben, ami azt jelenti, hogy ezeknek az objektumoknak a létrehozása, módosítása és manipulálása nagyon gyakori feladat a fejlesztő számára.
Adatosztály a Java-ban
így néz ki általában egy adatosztály a Java-ban:
észre fogod venni, hogy felülírjuk a toString()
, equals()
és hashCode()
módszereket (a Object.java
osztályban deklarálva ). Miért fontos ezeknek a módszereknek a felülbírálása az adatosztályokban?
e három módszer megvalósításakor értékobjektumokat hozunk létre, olyan osztályokat, amelyeknél bármely két, megfelelően azonos mezőértékkel rendelkező példány felcserélhetőnek tekinthető. (Megjegyzés: ahhoz, hogy teljesen igaz legyen, meg kell változtatnunk az osztályt. A mezők véglegesítése és a szetterek eltávolítása segít. A változhatatlanságot gyakran jó gyakorlatnak tekintik, és lehetőség szerint ajánlják)
-
equals()
: alapértelmezés szerinttrue
értéket ad vissza, csak akkor, ha a két változó ugyanarra az objektumra vonatkozik, azaz ha a memóriában lévő pozíció azonos. Felülbíráljuk ezt a módszert atrue
visszaadására, ha az objektumok ugyanazt az információt tartalmazzák, más szóval, ha az objektumok ugyanazt az entitást képviselik. Ellenőrzi, hogy a tulajdonságok azonosak – e, és ugyanazt az értéket tartalmazzák-e. -
hashCode()
: alapértelmezés szerint hexadecimálisan adja vissza az objektum memóriacímét. Ez egy numerikus érték egy objektum azonosítására az egyenlőség tesztelése során, azaz az egyenlő objektumok azonos hash kóddal rendelkeznek. Ezt a módszert felül kell írni, ha atoString()
felül van írva, így a tulajdonságok értékeiből számított hash kódot ad vissza. -
toString()
: Alapértelmezés szerint az objektum típusát és ahashCode()
értéket adja vissza, például[email protected]+
. Mi felülbírálja ezt a módszert, amelynek egy ember által olvasható változata az objektum, mint aUser(name=Steve, surname=Jobs)
.
annak ellenére, hogy ilyen fontos fogalom, a fenti Java kódban semmi sem különbözteti meg ezt az osztályt a többitől. A programozók felismerhetik adatosztályként az osztály szerkezete és mintái miatt, de a fordító szempontjából ez az osztály csak egy másik osztály.
az adatosztályok létrehozása olyan gyakori, hogy a fejlesztők gyakran használják az IDE-t és más plugineket, hogy segítsenek nekik ebben az ismétlődő feladatban. Az adatosztály Java-ban történő létrehozásának fájdalmát enyhíthetik a bővítmények vagy az IDE, de a legtöbb hibát ezen osztályok további módosításaival vezetik be. Nagyon könnyű elfelejteni, hogy módosítsa az összes Társ módszerek Ennek megfelelően minden alkalommal, amikor egy mező ez eltávolított vagy hozzáadott.
a Java adatosztályának nincs nyelvi támogatása. Ez egy ismétlődő és hibára hajlamos feladat, amely túl sok súrlódást jelent egy modern programozási nyelv számára.
egy adatosztály Kotlinben
ugyanez az adatosztály Kotlinben valahogy így nézne ki:
data class User(var name: String, var age: Int)
Kotlin emeli az adatosztályokat az első osztályú polgárok számára, bemutatva a data
kulcsszót. Bontsuk le.
- Getterek és szetterek
a getterek és szetterek automatikusan létrejönnek Kotlinben, amikor tulajdonságokat deklarálunk. Röviden, a var name: String
azt jelenti, hogy a User
osztálynak van egy tulajdonsága, amely nyilvános (Kotlin alapértelmezett láthatósága), változtatható (var
) és String
típusú. Mivel ez nyilvános, létrehozza a gettert, és mivel változtatható, létrehozza a szettert.
ha azt akarjuk, hogy az osztály csak olvasható legyen (nincs beállító), akkor a következőket kell használnunk val
:
data class User(val name: String, val age: Int)
a val
és var
azonos osztálydeklarációban keverhetők. A val
egy final
változónak tekinthető a Java-ban.
minden eddig elmagyarázott, ez a Kotlin bármely osztálydeklarációjára jellemző, de a data
kulcsszó az, ami itt különbséget tesz.
- a
data
kulcsszó
deklarálása egy osztály, mint egy adat osztály fog minket végre toString()
, hashCode()
és equals()
automatikusan ugyanúgy, ahogy fentebb leírtuk a Java osztály. Tehát, ha létrehozunk egy felhasználói osztályt, mint a User("Steve Jobs",56)
és meghívjuk a toString()
metódust, akkor valami ilyesmit kapunk:User(name=Steve Jobs, age=56)
.
Destrukturáló deklarációk
a data
kulcsszó olyan funkciókat biztosít, amelyek lehetővé teszik a destrukturáló deklarációkat. Röviden, ez létrehoz egy funkciót minden tulajdonság, így meg tudjuk csinálni a dolgokat, mint ez:
Copy function
a data
kulcsszó ad nekünk egy praktikus módja a másolás osztályok értékének megváltoztatásával egyes tulajdonságok. Ha azt akarjuk, hogy hozzon létre egy példányt a felhasználó megváltoztatja a kor, ez az út tennénk:
az osztálytestben deklarált tulajdonságok figyelmen kívül maradnak
a fordító csak az elsődleges konstruktorban definiált tulajdonságokat használja az automatikusan generált függvényekhez.
a tulajdonság address
nem fogja kezelni a data
kulcsszóval, tehát ez azt jelenti, hogy az automatikusan generált megvalósítások figyelmen kívül hagyják.
Pair and Triple
Pair
és Triple
standard adatosztályok a könyvtárban, de a Kotin dokumentumok maguk is megakadályozzák azok használatát az olvashatóbb és személyre szabottabb adatosztályok javára.
követelmények és korlátozások
- egy adatosztály-konstruktornak legalább egy paraméterrel kell rendelkeznie.
- minden paraméternek
val
vagyvar
néven kell lennie . - egy adatosztály nem lehet
abstract
,open
,sealed
vagyinner
. -
equals
,toString
ahashCode
metódusok pedig kifejezetten felülírhatók. - Explicit implementációk a
componentN()
éscopy()
függvényekhez nem engedélyezettek. - adatosztály levezetése egy
copy()
függvénymegfelelő aláírással rendelkező típusból a Kotlin 1.2-ben elavult, a Kotlin 1.3-ban pedig tilos volt. - a
data
osztály nem terjedhet ki egy másikdata
osztályból. - a
data
osztály kiterjesztheti más osztályok (mivel Kotlin 1.1)
az Adatosztályok Kotlin első osztályú állampolgárai. Nagyon rövid szintaxissal súrlódásmentes megoldást kínálnak minden előnnyel és kompromisszumok nélkül.
mit jelent az Android számára
megpróbálom elmagyarázni, hogy melyek a fő előnyök, amelyeket a Kotlin adatosztályok használatával találtam az Android projektjeimben. Ezek nem mind, és talán nem is a legfontosabbak, de az eddigi tapasztalataim alapján ezek a legnyilvánvalóbbak.

- adatmodellek
az Android architektúrája forró téma volt (és még mindig). Számos lehetőség létezik, de a legtöbbben közös az aggodalmak szétválasztása és az egységes felelősség elve. Clean Architecture-nagyon híres az Android közösség-egy sor jó gyakorlatok követni, ha célja a jó építészet, amely hangsúlyt fektet a különböző modellek különböző rétegeiben az építészet. Ez azt jelenti, hogy egy 3 vagy 4 különböző adatmodellel rendelkező projekt szabványossá válik.
ez azt jelenti, hogy a projekt adatosztályainak száma nagyon magas, és az olyan műveletek, mint a létrehozás, olvasás, módosítás, másolás, összehasonlítás, térkép… az adatmodell osztályok napi feladatok, amelyek részesülnek a Kotin Adatosztály automatikusan generált kódjából. Rengeteg időt takarít meg, és csökkenti a hibák bevezetésének lehetőségeit.
- nincs több Automatikus érték
az értéktípusok használata jó gyakorlat az Androidban, különösen az adatosztályok között.
az értéktípus egy megváltoztathatatlan értékosztályból származó objektum.
az értékosztály olyan osztály, amelynek egyenlősége a tartalmától függ.
a megváltoztathatatlan osztály olyan osztály, amelyet a létrehozás után nem lehet módosítani.
az AutoValue egy népszerű könyvtár a Google-tól, amely segít értéktípusok létrehozásában. Ez teszi a dolgát, de ez nagyon bőbeszédű valamit, ami nem lehet olyan bonyolult.
a kotlin data
osztályok használata a val
hozzáférési módosítóval elég közelítést ad az értéktípusokhoz.
data class User(val name : String, val age : Int)
az előző felhasználói osztály egy olyan osztály, amely elég közel áll az értéktípusokhoz, sokkal rövidebb szintaxissal. Egy jó darab ember számára az AutoValue helyettesíthető Kotlinnel. Kevesebb kód, nincs kommentárfeldolgozás, és eggyel kevesebb könyvtár függ.
Megjegyzés: Kotlin csak olvasható tulajdonságokat és osztályokat kínál a val
kulcsszóval. A csak olvasható és megváltoztathatatlan nem ugyanaz (többet itt), de általában elég jónak tekinthető gyakorlati célokra.
- No more Lombok
az egyik módja annak, hogy a fejlesztők időt takarítsanak meg az adatosztályok kezelése során, a könyvtárak használata getter és setter módszerek létrehozására. Lombok az egyik (in)híres az Android/Java-ban. Ehhez nem csak a könyvtár, hanem egy plugin AS. A hosszú történet rövid a legtöbb fejlesztő Lombok hogy annyi előnye van, mint a fejfájás, így válik, hogy a könyvtár elkezd szeretni, de egy idő után, nem lehet várni, hogy megszabaduljon, de soha nem, mert mindenhol.
tekintettel arra, hogy a Kotlin Adatosztályoknak nem kell manuálisan írniuk getter/szetter módszereket, a Lombok fő igénye megszűnt.
- RecyclerView DiffUtil
RecyclerView Android a widget. Minden alkalmazásban több képernyőn van. Az újrahasznosítás egyik fontos elemea nézet adapterek a DiffUtil osztály. A DiffUtil kiszámítja a két lista közötti különbséget annak érdekében, hogy a módosításokat-ha vannak – elküldje az adapternek. Sokkal hatékonyabb, mint az egész lista újra és újra frissítése, és gyönyörűen animálja a változásokat.
a DiffUtil nagymértékben támaszkodik az elemek egyenlőségére, vagyis két elem azonos, ha tartalmuk azonos. Minden alkalommal, amikor RecyclerView-t használ, a DiffUtil-t kell használnia, ami azt jelenti, hogy összehasonlításra van szüksége, ha két objektum ugyanazt az információt tartalmazza. Ez az egyik oka annak, hogy felül kell írnunk a equals
értéket a Java adatosztályainkban, de a Kotlin data
osztályokkal ingyen jön.
Megjegyzés: Ha nem ismeri a DiffUtil-t, ellenőrizze ezt a gyors üzembe helyezési útmutatót.
- tesztek
a tesztosztályokban folyamatosan ellenőrizzük, hogy a várt értékek megegyeznek-e a tényleges értékekkel. Az objektumok egyenlőségének összehasonlítása (a korábban leírtak szerint) nagyon gyakori feladat.
még akkor is, ha nem kell felülírnia a equals
, toString
és toHash
triplett az Ön rendszeres app runtime, az esélye, hogy lesz szüksége, hogy felülírja ezeket a módszereket tesztelési célokra nagy, így Kotlin adatosztályok törölje az utat a tesztelés nincs kifogás.
kiegészítés
beszéljünk néhány más gyakori forgatókönyvről, amelyeket érdemes megemlíteni, amikor Kotlin adatosztályokkal dolgozunk. Ez nem szigorúan kapcsolódik az adatosztályokhoz, de különösen gyakori közöttük.
- több konstruktor
data class User(val name : String, val age : Int)
a korábban definiált User
osztályban explicit módon meg kell adnunk a name
és age
értékeket, amikor létrehozunk egy olyan példányt, mint a User("Steve", 56)
.
Kotlinben definiálhatjuk az argumentumok alapértelmezett értékeit oly módon, hogy abban az esetben, ha nem adjuk át az argumentum értékét, az alapértelmezett értéket rendeljük hozzá.
data class User(val name : String, val age :Int = 0)
User("Steve", 56)
továbbra is érvényes, de most egy második konstruktor User("Steve")
megengedett. Ebben az esetben a age
érték 0 lesz.
alapértelmezett értékeket rendelhetünk mindkét paraméterhez, lehetővé téve a User()
harmadik konstruktort, ahol az name
üres lesz, a age
pedig 0 lesz.
data class User(val name : String = "", val age : Int = 0)
tehát most User()
, User("Steve")
és User("Steve",56)
mind érvényes hívások.
ennek vannak korlátai: Az opcionális paramétereknek a konstruktor utolsó paramétereinek kell lenniük. A következő nem fog összeállni.
data class User(val name : String = "", val age : Int)
val user = User(56) // This doesn't compile
további korlátozás, hogy ha több opcionális paraméterünk van, azokat jobbról balra kell kihagyni.
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
ennek a korlátozásnak a kezelésére Kotlin nevesített argumentumokat kínál. Ez lehetővé teszi számunkra, hogy meghatározzuk, melyik argumentum tartozik minden értékhez. Most olyan dolgokat tehetünk, mintUser(name = "Steve", age = 56)
— vagy rövidebb User("Steve", age = 56)
– ahol a vezetéknév Az alapértelmezett értékhez lesz rendelve.
Az alapértelmezett argumentumok és a megnevezett argumentumok nagyon hasznos módja annak, hogy több konstruktort és túlterhelést kínáljunk egy nagyon kompakt deklarációból.
- @JvmOverloads
az előző pontban leírtak nem veszik figyelembe a Java oldalról érkező hívásokat. Kotlin interoperábilis a Java-val, így képesnek kell lennünk a User
osztály példányainak létrehozására Java-ból.
ha nem fogja használni a Java-ból, akkor kész, de egyébként szüksége lesz a @JvmOverloads
kommentárra, mivel a Java nem kínál megnevezett argumentumokat.
data class User @JvmOverloads constructor(
val name : String,
val surname : String = "",
val age : Int = 0
)
mi ez csinál generáló több konstruktorok, így lehet nevezni a Java.
MEGJEGYZÉS: fontos megjegyezni, hogy nem minden lehetséges permutációt fog létrehozni, hanem azokat, amelyek az opcionális argumentumok jobbról balra történő eltávolításából származnak. Bővebben itt
- Builders
mivel Kotlin ajánlatok megnevezett paraméterek és alapértelmezett argumentumok, ez teszi kevésbé valószínű, hogy szükség van építők. Ráadásul a modern IDE-k, mint például az Android Studio, már megmutatják a paraméter nevét a hívó oldalon, megkönnyítve az olvasást, így kevésbé érdekes csak olvashatóság céljából.
azokban az esetekben, amikor az építőminta még mindig szükséges. Kotlin nem kínál semmi különlegeset, hogy segítsen nekünk. A Kotlin építőmintája így néz ki:
- Megjegyzések
nagyon gyakori, hogy egyes adatmodell osztályok annotációs feldolgozást használnak. Például API modellek (adatosztályok az API dezerializált válaszainak ábrázolására) gyakran jegyzetekkel vannak ellátva Gson vagy Moshi kommentárok. A perzisztencia modellek (a helyi tárolóban/adatbázisokban tárolt adatok ábrázolására szolgáló adatosztályok) gyakran szobai vagy birodalmi jegyzetekkel vannak ellátva.
Kotlinban még mindig használhatjuk ezeket a kommentárokat. Például, ez egy felhasználói modell, amelyet a szoba adatbázisában kell tárolni:
Összegzés
Kotlin adat osztályok az eredménye éves tanulás fájdalom és frusztráció adat osztályok Java. Arra törekszenek, hogy minden előnyük legyen, és ne legyenek hátrányai. Használata nagyon egyszerű és élvezetes, és ha egyszer megszokja, nagyon nehéz visszanézni.
az Androidban különböző módon segítenek nekünk, de többnyire sok időt takarítanak meg és csökkentik a hibákat.
a Kotlin adatosztály jó példa arra, hogy mi a Kotlin programozási nyelv: tömör, pragmatikus és öröm a fejlesztők számára.