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 palauttaa true vain, jos kaksi muuttujaa viittaavat samaan kohteeseen eli jos asema muistissa on sama. Ohitamme tämän menetelmän palauttaa true, 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, kun toString() ohitetaan, joten se palauttaa ominaisuuksien arvoista lasketun hash-koodin.
  • toString(): Oletusarvoisesti palauttaa oliotyypin ja hashCode(), esimerkiksi [email protected]+ . Ohitamme tämän menetelmän, jotta objektista saadaan ihmisluettavampi versio, kuten User(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 tai var .
  • dataluokka ei voi olla abstract, open, sealed tai inner .
  • equals , toString ja hashCode menetelmät voidaan eksplisiittisesti ohittaa.
  • eksplisiittisiä toteutuksia componentN() ja copy() 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 toisesta data 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.

Vastaa

Sähköpostiosoitettasi ei julkaista.

lg