Zapečaćena nastava u Kotlinu

1. Uvod

Jednostavno rečeno, jezik Kotlin posudio je brojne koncepte iz drugih funkcionalnih jezika kako bi pomogao u pisanju sigurnijeg i čitljivijeg koda. Zapečaćene hijerarhije jedan je od tih pojmova.

2. Što je zapečaćeni razred?

Zapečaćene klase omogućuju nam da popravimo hijerarhije tipova i zabranjuju programerima stvaranje novih potklasa.

Korisni su kada imate vrlo strogu hijerarhiju nasljeđivanja, s određenim skupom mogućih potklasa i bez drugih. Prevoditelj jamči da iz njega mogu naslijediti samo klase definirane u istoj izvornoj datoteci kao i zapečaćena klasa.

Zapečaćene klase su također implicitno sažetak. S njima bi se trebali postupati u ostatku koda, osim što ih ništa drugo nije u stanju implementirati.

Zapečaćene klase mogu u sebi definirati polja i metode, uključujući apstraktne i implementirane funkcije. To znači da možete imati osnovni prikaz klase, a zatim ga prilagoditi u skladu s podrazredima.

3. Kada koristiti zatvorene satove?

Zapečaćene klase dizajnirane su za upotrebu kada postoji vrlo specifičan skup mogućih opcija za vrijednost i gdje se svaka od ovih opcija funkcionalno razlikuje - samo algebarski tipovi podataka.

Uobičajeni slučajevi upotrebe mogu uključivati ​​implementaciju državnog stroja ili u monadsko programiranje, koje postaje sve popularnije pojavom koncepata funkcionalnog programiranja.

Kad god imate više mogućnosti, a one se razlikuju samo u značenju podataka, možda će vam biti bolje koristiti Enum klase.

Kad god imate nepoznat broj opcija, ne možete koristiti zapečaćenu klasu jer će to zaustaviti dodavanje opcija izvan izvorne izvorne datoteke.

4. Pisanje zapečaćenih predavanja

Počnimo s pisanjem vlastite zapečaćene klase - dobar primjer takve zapečaćene hijerarhije je Neobvezno s Jave 8 - koja može biti bilo koja Neki ili Nijedna.

Kada se ovo implementira, ima puno smisla ograničiti mogućnost stvaranja novih implementacija - dvije predviđene implementacije su iscrpne i nitko ne bi trebao dodavati svoje.

Kao takvi, možemo implementirati ovo:

zapečaćena klasa Neobvezna {// ... sažetak zabave jePresent (): Boolean} klasa podataka Neki (vrijednost valu: V): Izborno () {// ... nadjačati zabavu je klasaPresent (): Boolean = true} klasa Nijedna: Neobvezna () {// ... override fun isPresent (): Boolean = false}

Sada se može jamčiti da ćete u bilo kojem trenutku imati primjerak Neobvezno, zapravo imate ili Neki ili Nijedan.

U Javi 8 stvarna implementacija izgleda drugačije zbog odsustva zapečaćenih klasa.

Tada to možemo iskoristiti u našim proračunima:

rezultat val: Neobvezno = podijeli (1, 0) println (result.isPresent ()) if (rezultat je Neki) {println (result.value)}

Prvi će redak vratiti a Neki ili a Nijedna. Zatim izlazimo jesmo li ili nismo dobili rezultat.

5. Koristite s kada

Kotlin ima podršku za korištenje zatvorenih klasa u svom kada konstruira. Budući da uvijek postoji točan skup mogućih podrazreda, kompajler vas može upozoriti ako se s bilo kojom granom ne postupa, na potpuno isti način kao i za nabrajanje.

To znači da u takvim situacijama obično nema potrebe za hvatačem svih, što zauzvrat znači da je dodavanje nove podklase automatski sigurno - kompajler će vas odmah upozoriti ako to niste učinili i trebat će vam ispraviti takve pogreške prije nastavka.

Gornji se primjer može proširiti na rezultat ili na pogrešku, ovisno o vraćenom tipu:

val message = when (result) {is Some -> "Answer: $ {result.value}" is None -> "No result"} println (poruka)

Ako nedostaje bilo koja od dviju grana, ovo se ne bi kompajliralo, već bi rezultiralo pogreškom:

izraz "kada" mora biti iscrpan, dodajte potrebnu granu "else"

6. Sažetak

Zapečaćene klase mogu biti neprocjenjiv alat za vaš alatni okvir za dizajn API-ja. Dopuštanje dobro poznate, strukturirane hijerarhije klasa koja ikad može biti samo jedna od očekivanih skupova klasa može pomoći ukloniti cijeli niz potencijalnih stanja pogrešaka iz vašeg koda, a istovremeno olakšati čitanje i održavanje stvari.

Kao i uvijek, isječke koda možete pronaći na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found