
dataluokka on käsite, jota ei ole sidottu mihinkään tiettyyn ohjelmointikieleen, se on malli, joka on tarpeeksi kätevä useimmille ohjelmoijille yksinkertaisena tapana esittää, kapseloida ja siirtää tietoa.
dataluokalla tarkoitetaan luokkaa, joka sisältää vain kenttiä ja crud-menetelmiä niiden käyttöön (getterit ja setterit). Nämä ovat vain säiliöitä muiden luokkien käyttämille tiedoille. Nämä luokat eivät sisällä mitään lisätoimintoja, eivätkä ne voi itsenäisesti toimia omistamillaan tiedoilla.
yleensä dataluokat edustavat reaalimaailman entiteettejä, ja on tavallista, että projektissa on kymmeniä tai satoja näitä luokkia, mikä tarkoittaa, että näiden objektien luominen, muokkaaminen ja manipulointi on hyvin yleinen tehtävä kehittäjälle.
a Dataluokka Javassa
näin dataluokka yleensä näyttää Javassa:
huomaatte, että ohitamme toString()
, equals()
ja hashCode()
menetelmät (ilmoitettu Object.java
luokassa). Miksi näiden menetelmien ohittaminen on tärkeää tietoluokissa?
toteutettaessa näitä kolmea menetelmää luomme arvo-objekteja, luokkia, joille mitkä tahansa kaksi ilmentymää, joilla on sopivasti yhtäläiset kenttäarvot, katsotaan vaihdettaviksi. (Huomautus: olla täysin totta, meidän täytyy tehdä luokan muuttumaton. Kenttien tekeminen lopullisiksi ja settereiden poistaminen auttavat. Muuttumattomuutta pidetään usein hyvänä käytäntönä ja suositellaan mahdollisuuksien mukaan)
-
equals()
: oletusarvoisesti palauttaatrue
vain, jos kaksi muuttujaa viittaavat samaan kohteeseen eli jos asema muistissa on sama. Ohitamme tämän menetelmän palauttaatrue
, jos oliot sisältävät samaa tietoa, toisin sanoen jos oliot edustavat samaa oliota. Se tarkistaa ominaisuudet ovat samat ja ne sisältävät saman arvon. -
hashCode()
: oletusarvoisesti palauttaa kohteen muistiosoitteen heksadesimaalisena. Se on numeerinen arvo objektin tunnistamiseksi tasa-arvotestauksen aikana, eli tasa-arvoisilla objekteilla on sama hajautuskoodi. Tämä menetelmä on ohitettava, kuntoString()
ohitetaan, joten se palauttaa ominaisuuksien arvoista lasketun hash-koodin. -
toString()
: Oletusarvoisesti palauttaa oliotyypin jahashCode()
, esimerkiksi[email protected]+
. Ohitamme tämän menetelmän, jotta objektista saadaan ihmisluettavampi versio, kutenUser(name=Steve, surname=Jobs)
.
siitä huolimatta, että kyseessä on näin tärkeä käsite, yllä olevassa Java-koodissa ei ole mitään, mikä tekisi tästä luokasta mitenkään erilaisen kuin mistään muusta. Ohjelmoijat voivat tunnistaa sen dataluokaksi luokkarakenteen ja kuvioiden vuoksi, mutta kääntäjän näkökulmasta tämä luokka on vain toinen luokka.
dataluokkien luominen on niin yleistä, että kehittäjät käyttävät usein IDE: tä ja muita liitännäisiä apunaan tässä toistuvassa tehtävässä. Java-dataluokan luomisen tuskaa voidaan lievittää liitännäisillä tai IDE: llä, mutta useimmat virheet otetaan käyttöön näiden luokkien lisämuutoksissa. Se on erittäin helppo unohtaa muokata kaikkia kumppani menetelmiä vastaavasti aina kentän se poistetaan tai lisätään.
Java-kielen dataluokasta puuttuu kielituki. Se on toistuva ja bugeille altis tehtävä, joka edustaa liikaa kitkaa nykyaikaiselle ohjelmointikielelle.
Kotlinin dataluokka
sama Kotlinin dataluokka näyttäisi jotakuinkin tältä:
data class User(var name: String, var age: Int)
Kotlin nostaa dataluokat ykkösluokan kansalaisiksi ottamalla käyttöön data
– hakusanan. Murretaan se.
- Getterit ja setterit
kotlinissa getterit ja setterit luodaan automaattisesti, kun ilmoitamme ominaisuuksia. Lyhyesti sanottuna var name: String
tarkoittaa sitä, että User
luokalla on ominaisuus, joka on julkinen (oletusnäkyvyys Kotlinissa), muuntuva (var
) ja on String
tyyppi. Koska se on julkista, se luo getterin, ja koska se on muunneltavissa, se luo setterin.
jos haluamme tehdä luokasta vain lukulaitteen (ei settereitä), meidän on käytettävä val
:
data class User(val name: String, val age: Int)
voimme sekoittaa val
ja var
samaan Luokka-ilmoitukseen. val
voidaan ajatella final
– muuttujana Jaavalla.
kaikki selitetty tähän mennessä, se on yhteistä mille tahansa Kotlinin luokkajulistukselle, mutta data
– hakusanalla on tässä merkitystä.
-
data
hakusana
luokan julistaminen dataluokaksi saa meidät toteuttamaan toString()
, hashCode()
ja equals()
automaattisesti samalla tavalla kuin edellä kuvailtiin Java-luokalle. Jos siis luomme käyttäjäluokan, kuten User("Steve Jobs",56)
ja kutsumme toString()
metodia, saamme jotain:User(name=Steve Jobs, age=56)
.
Destruction declarations
data
hakusanalla on toimintoja, jotka mahdollistavat Destruction declarations. Lyhyesti sanottuna se luo funktion jokaiselle kiinteistölle, jotta voimme tehdä tällaisia asioita:
Kopiointifunktio
data
hakusanalla saadaan näppärä tapa kopioida luokkia muuttamalla joidenkin ominaisuuksien arvoa. Jos haluamme luoda kopion käyttäjän muuttaa ikää, näin me tekisimme sen:
luokan rungossa ilmoitettuja ominaisuuksia ei huomioida
Kääntäjä käyttää automaattisesti syntyville funktioille vain ensisijaisen konstruktorin sisällä määriteltyjä ominaisuuksia.
ominaisuus address
sitä ei käsitellä data
-hakusanalla, joten se tarkoittaa, että automaattisesti luodut toteutukset jättävät sen huomiotta.
pari-ja Kolmoisluokat
Pair
ja Triple
ovat kirjaston vakiotietoluokkia, mutta Kotin dokumentit itse estävät niiden käytön ja suosivat luettavampia ja räätälöidympiä dataluokkia.
vaatimukset ja rajoitukset
- dataluokan rakentajalla on oltava vähintään yksi parametri.
- kaikkien parametrien on oltava markkinanumerolla
val
taivar
. - dataluokka ei voi olla
abstract
,open
,sealed
taiinner
. -
equals
,toString
jahashCode
menetelmät voidaan eksplisiittisesti ohittaa. - eksplisiittisiä toteutuksia
componentN()
jacopy()
funktioille ei sallita. - dataluokan johtaminen tyypistä, jolla on
copy()
funktiota vastaava allekirjoitus, vanhentui Kotlin 1.2: ssa ja kiellettiin Kotlin 1.3: ssa. - A
data
luokka ei voi ulottua toisestadata
luokasta. - a
data
luokka voi laajentaa muita luokkia (koska Kotlin 1.1)
Dataluokat ovat kotlinissa ensimmäisen luokan kansalaisia. Erittäin lyhyessä syntaksissa ne tarjoavat kitkattoman ratkaisun, jossa on kaikki edut eikä kompromisseja.
What does it means for Android
I ’m gonna try to explain what are the main advantages that I’ ve found using Kotlin data classes in my Android projects. Nämä eivät ole kaikki, eivätkä ehkä tärkeimmät, mutta nämä ovat tähänastisen kokemukseni perusteella ilmeisimmät.

- Datamallit
Androidin arkkitehtuuri oli (ja on edelleen) kuuma puheenaihe. Vaihtoehtoja on useita, mutta useimmille niistä on yhteistä huolien erottaminen ja yhden vastuun periaatteet. Clean Architecture-hyvin tunnettu Android-yhteisössä-on joukko hyviä käytäntöjä, joita on noudatettava pyrittäessä hyvään arkkitehtuuriin, jossa korostetaan eri mallien käyttämistä arkkitehtuurin eri kerroksille. Tämä tarkoittaa, että projektista, jossa on 3 tai 4 erilaista tietomallia, tulee standardi.
tämä tarkoittaa sitä, että dataluokkien määrä projektissa on erittäin suuri, ja toiminnot kuten Luo, Lue, Muokkaa, Kopioi, vertaa, kartta… tietomalliluokat ovat päivittäisiä tehtäviä, jotka hyötyvät Kotin Dataluokan automaattisesti luodusta koodista. Säästää valtavasti aikaa ja vähentää mahdollisuuksia ottaa käyttöön vikoja.
- No more Auto-Value
arvotyyppien käyttö on hyvä käytäntö, joka on hyvin laajennettu Androidissa, erityisesti dataluokissa.
arvotyyppi on muuttumattoman arvoluokan objekti.
arvoluokka on luokka, jonka tasa-arvo riippuu sen sisällöstä.
muuttumaton luokka on luokka, jota ei voi muuttaa luomisen jälkeen.
AutoValue on Googlen suosittu kirjasto, joka auttaa arvotyyppien luomisessa. Se tekee tehtävänsä, mutta se on hyvin monisanainen asialle, jonka ei pitäisi olla niin monimutkaista.
Kotlin data
– luokkien käyttäminen val
access-modifierin kanssa antaa riittävän likiarvotyypeille riittävän likiarvon.
data class User(val name : String, val age : Int)
edellinen Käyttäjäluokka on luokka, joka on tarpeeksi lähellä arvotyyppejä, paljon lyhyemmässä syntaksissa. Hyvälle porukalle Autovalun voi korvata Kotlinilla. Vähemmän koodia, ei merkintöjen käsittelyä, ja yksi kirjasto vähemmän riippuvainen.
Huom: Kotlin tarjoaa lukuominaisuuksia ja-luokkia val
– hakusanalla. Vain luku-ja muuttumaton ei ole sama (lisää täällä), mutta yleisesti, pidetään tarpeeksi hyvä käytännön tarkoituksiin.
- No more Lombok
yksi tapa, jolla kehittäjät yrittivät säästää aikaa dataluokkien käsittelyssä, on käyttää kirjastoja getter-ja setter-menetelmien luomiseen. Lombok on yksi (In) kuuluisa niistä Android/Java. Se vaatii paitsi kirjasto, mutta myös plugin AS. Pitkä tarina lyhyt on useimmille kehittäjille Lombok tuoda niin paljon etuja kuin päänsärkyä, joten se tulee että kirjasto alkaa rakastava mutta jonkin ajan kuluttua, et voi odottaa päästä eroon, mutta et koskaan tee, koska on kaikkialla.
koska Kotlinin Dataluokkien ei tarvitse kirjoittaa getter/setter-menetelmiä käsin, Lombokin päätarve on poissa.
- RecyclerView DiffUtil
RecyclerView Androidissa on vekotin. Se on jokaisessa sovelluksessa useilla näytöillä. DiffUtil-luokka on yksi tärkeä komponentti Kierrätyssovittimien käyttöönotossa. DiffUtil laskee kahden luettelon väliset erot lähettääkseen mahdolliset muutokset adapteriin. Se on paljon tehokkaampaa kuin koko listan päivittäminen uudelleen ja uudelleen, ja se elävöittää muutokset kauniisti.
DiffUtil nojaa vahvasti alkioiden tasa-arvoon, eli kaksi kohdetta ovat samoja, kun niiden sisältö on sama. Aina kun käytät Kierrätyskatsomoa, sinun pitäisi käyttää Diffutilia, mikä tarkoittaa, että tarvitset tavan vertailla, jos kaksi esinettä sisältää samat tiedot. Tämä on yksi syy equals
ohittamiseen Java-dataluokissamme, mutta Kotlin data
– luokissa se tulee ilmaiseksi.
Huomautus: Jos et ole perehtynyt Diffutiliin, tarkista tämä pikaopas.
- testit
testiluokissa tarkistetaan jatkuvasti, vastaavatko odotusarvot todellisia arvoja. Kohteiden vertaaminen tasa-arvoon (kuten edellä on kuvattu) on hyvin yleinen tehtävä.
vaikka sinun ei tarvitsisi ohittaa equals
, toString
ja toHash
tripletiä tavallisille sovelluksillesi, mahdollisuudet, että sinun täytyy ohittaa nämä menetelmät testaustarkoituksiin ovat suuret, joten Kotlin dataluokat raivaavat tien testaukseen ilman tekosyitä.
Addendum
Let ’ s talk about some other common scenarions worth mentioning when working with Kotlin data classes. Tämä ei liity tiukasti dataluokkiin, mutta on erityisen yleistä niiden keskuudessa.
- Useita rakentajia
data class User(val name : String, val age : Int)
aiemmin määrittelemässämme User
– luokassa on erikseen määriteltävä name
ja age
, kun luodaan esimerkiksi User("Steve", 56)
.
kotlinissa voimme määritellä oletusarvot argumenteille siten, että mikäli emme läpäise arvoa kyseiselle argumentille, sille annetaan oletusarvo.
data class User(val name : String, val age :Int = 0)
User("Steve", 56)
on edelleen voimassa, mutta nyt sallitaan toinen konstruktori User("Steve")
. Tällöin age
arvo on 0.
voimme määrittää oletusarvot molemmille parametreille, jolloin kolmas konstruktori User()
, jossa name
on tyhjä ja age
on 0.
data class User(val name : String = "", val age : Int = 0)
joten nyt User()
, User("Steve")
ja User("Steve",56)
kaikki ovat kelvollisia kutsuja.
tässä on joitakin rajoituksia: valinnaisten parametrien tulee olla rakentajan viimeisiä parametreja. Seuraava ei käänny.
data class User(val name : String = "", val age : Int)
val user = User(56) // This doesn't compile
toinen rajoitus on, että jos meillä on useita valinnaisia parametreja, ne on ohitettava oikealta vasemmalle.
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
tämän rajoituksen käsittelemiseksi Kotlin tarjoaa nimettyjä argumentteja. Näin voidaan määritellä, mille argumentille jokainen arvo kuuluu. Nyt voidaan tehdä sellaisia asioita kuinUser(name = "Steve", age = 56)
– tai lyhyempi User("Steve", age = 56)
– joissa sukunimi merkitään oletusarvoon.
Oletusargumentit ja nimetyt argumentit ovat erittäin kätevä tapa tarjota useita rakentajia ja ylikuormituksia hyvin kompaktista julistuksesta.
- @JvmOverloads
kaikki edellisessä kohdassa selitetty ei ota huomioon Java-puolen puheluita. Kotlin on yhteentoimiva Java, joten meidän täytyy pystyä luomaan esiintymiä User
Luokka Java.
jos et aio käyttää sitä Javalta, olet valmis, mutta muuten tarvitset @JvmOverloads
– huomautuksen, koska Java ei tarjoa nimettyjä argumentteja.
data class User @JvmOverloads constructor(
val name : String,
val surname : String = "",
val age : Int = 0
)
mitä tämä tekee generoimalla useita konstruktioita, joten sitä voidaan kutsua Jaavalta.
huomaa: on tärkeää huomata, että se ei luo kaikkia mahdollisia permutaatioita, vaan ne, jotka johtuvat valinnaisten argumenttien poistamisesta oikealta vasemmalle. Lisää tässä
- rakentajat
koska Kotlin tarjoaa nimettyjä parametrejä ja oletusargumentteja, se vähentää rakentajien tarvetta. Päälle, että, moderni IDEs kuten Android Studio jo näyttää parametrin nimi kutsuvan puolella, joten se on helpompi lukea, joten se vähemmän mielenkiintoinen vain luettavuus tarkoituksiin.
niissä tapauksissa, joissa rakentajakuviota vielä tarvitaan. Kotlin ei tarjoa mitään erityistä avuksi. Rakentajakuvio Kotlinissa näyttää:
- huomautukset
on hyvin yleistä, että joissakin tietomalliluokissa käytetään huomautusten käsittelyä. Esimerkiksi API-mallit (dataluokat, jotka kuvaavat API: n deserialisoituja vastauksia) on usein merkitty gson-tai Moshi-merkinnöillä. Pysyvyysmallit (paikallisiin tallennustiloihin/tietokantoihin tallennettuja tietoja kuvaavat tietoluokat) on usein merkitty huoneen tai alueen merkinnöillä.
kotlinissa voidaan vielä käyttää noita merkintöjä. Tämä on esimerkiksi käyttäjän malli, joka tallennetaan huoneen tietokantaan.:
Yhteenveto
Kotlin dataluokat ovat tulosta vuosien oppimisesta kivusta ja turhautumisesta Dataluokkiin Javassa. Niillä pyritään saamaan kaikki edut eikä mitään haittoja. Niiden käyttäminen on hyvin yksinkertaista ja nautinnollista, ja kun siihen tottuu, on hyvin vaikea katsoa taaksepäin.
Androidissa ne auttavat meitä eri tavoin, mutta enimmäkseen ne säästävät paljon aikaa ja vähentävät vikoja.
Kotlinin dataluokka on hyvä esimerkki siitä, mitä Kotlin on ohjelmointikielenä: ytimekäs, pragmaattinen ja kehittäjien ilonaihe.