Zárt osztályok Kotlinban

1. Bemutatkozás

Egyszerűen fogalmazva: a Kotlin nyelv számos fogalmat kölcsönzött más funkcionális nyelvekből, hogy segítsen a biztonságosabb és olvashatóbb kód megírásában. A lezárt hierarchiák egyike ezeknek a fogalmaknak.

2. Mi az a lezárt osztály?

A lezárt osztályok lehetővé teszik számunkra a típusú hierarchiák javítását, és megtiltják a fejlesztőknek, hogy új alosztályokat hozzanak létre.

Akkor hasznosak, ha nagyon szigorú öröklési hierarchia van, a lehetséges alosztályok meghatározott halmazával, és nincsenek mások. A fordító garantálja, hogy csak a lezárt osztállyal azonos forrásfájlban meghatározott osztályok örökölhetnek belőle.

A lezárt osztályok hallgatólagosan is absztrakt. A kód többi részében ilyenként kell kezelni őket, kivéve, hogy semmi más nem képes végrehajtani őket.

A lezárt osztályok mezőit és módszereit definiálhatják, beleértve az absztrakt és a megvalósított funkciókat is. Ez azt jelenti, hogy rendelkezhet az osztály alapreprezentációjával, majd beállíthatja az alosztályokra illeszkedő módon.

3. Mikor kell használni a lezárt osztályokat?

A lezárt osztályokat akkor tervezték használni, amikor a lehetséges opciók nagyon specifikusak értékre, és ahol ezek a lehetőségek funkcionálisan különböznek - csak az algebrai adattípusok.

A gyakori felhasználási esetek között szerepelhet egy State Machine vagy a Monadic Programming megvalósítása, amely a funkcionális programozási koncepciók megjelenésével egyre népszerűbb.

Bármikor több lehetőséged van, és ezek csak az adatok értelmében különböznek egymástól, jobb lehet, ha inkább az Enum osztályokat használod.

Bármikor ismeretlen számú opcióval rendelkezik, nem használhat lezárt osztályt, mert ez megakadályozza az eredeti forrásfájlon kívüli opciók hozzáadását.

4. Zárt osztályok írása

Kezdjük azzal, hogy megírjuk saját lezárt osztályunkat - az ilyen pecsétes hierarchia jó példája egy Választható Java 8-ból - amely lehet akár Néhány vagy Egyik sem.

Ennek megvalósításakor sok értelme van új megvalósítások létrehozásának lehetőségét korlátozni - a két biztosított megvalósítás kimerítő és senkinek sem szabad hozzáadnia a sajátját.

Mint ilyen, ezt meg tudjuk valósítani:

sealed class Opcionális {// ... abstract fun isPresent (): Boolean} adatosztály Some (val érték: V): Opcionális () {// ... override fun isPresent (): Boolean = true} class Nincs: Opcionális () {// ... felülírja a fun isPresent (): logikai = hamis}

Most garantálható, hogy bármikor van példánya Választható, valójában vagy a Néhány vagy egy Nincs.

A Java 8-ban a tényleges megvalósítás másképp néz ki, mivel nincsenek lezárt osztályok.

Ezután ezt felhasználhatjuk számításaink során:

val eredmény: Opcionális = ossza (1, 0) println (eredmény.isPresent ()), ha (az eredmény némelyik) {println (eredmény.érték)}

Az első sor vagy a-t ad vissza Néhány vagy a Egyik sem. Ezután kinyomtatjuk, hogy van-e eredményünk vagy sem.

5. Használja a Amikor

Kotlin támogatja a zárt osztályok használatát mikor konstrukciókat. Mivel a lehetséges alosztályok mindig pontosan vannak, a fordító figyelmeztethet, ha valamelyik ágat nem kezelik, pontosan ugyanúgy, mint a felsorolásoknál.

Ez azt jelenti, hogy ilyen helyzetekben általában nincs szükség mindenre kiterjedő kezelőre, ami viszont azt jelenti, hogy egy új alosztály hozzáadása automatikusan biztonságos - a fordító azonnal figyelmeztet, ha nem kezelte, és szüksége lesz kijavítani az ilyen hibákat a folytatás előtt.

A fenti példa kibővíthető az eredmény vagy a hiba kimenetére a visszaadott típustól függően:

val üzenet = mikor (eredmény) {van Néhány -> "Válasz: $ {result.value}" nincs -> "Nincs eredmény"} println (üzenet)

Ha a két ág bármelyike ​​hiányzik, akkor ez nem fordítható össze, hanem a következő hibát eredményezi:

"amikor" kifejezésnek teljesnek kell lennie, adja hozzá a szükséges "else" ágat

6. Összefoglalás

A lezárt osztályok felbecsülhetetlen értékű eszközök lehetnek az API tervezés eszköztárában. Ha lehetővé tesz egy jól ismert, strukturált osztályhierarchiát, amely csak egyike lehet a várt osztálycsoportoknak, az eltávolíthatja a lehetséges hibakörülmények egész halmazát a kódból, miközben a dolgokat még mindig könnyen olvashatja és fenntartja.

Mint mindig, a kódrészletek is megtalálhatók a GitHubon.


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