Uzavreté triedy v Kotline

1. Úvod

Zjednodušene povedané, jazyk Kotlin si požičal množstvo konceptov z iných funkčných jazykov, aby pomohol pri písaní bezpečnejších a čitateľnejších kódov. Uzavreté hierarchie sú jedným z týchto konceptov.

2. Čo je uzavretá trieda?

Zapečatené triedy nám umožňujú opraviť hierarchie typov a zakázať vývojárom vytvárať nové podtriedy.

Sú užitočné, keď máte veľmi prísnu hierarchiu dedičstva s konkrétnou sadou možných podtried a žiadnymi inými. Kompilátor zaručuje, že z neho môžu dediť iba triedy definované v rovnakom zdrojovom súbore ako zapečatená trieda.

Uzavreté triedy sú tiež implicitne abstraktné. S nimi by sa malo zachádzať ako so zvyškom vášho kódu, okrem toho, že ich nie je možné implementovať nič iné.

Uzavreté triedy môžu mať v sebe definované polia a metódy vrátane abstraktných aj implementovaných funkcií. To znamená, že môžete mať základné zastúpenie triedy a potom ju upraviť tak, aby vyhovovala podtriedam.

3. Kedy použiť uzavreté triedy?

Uzavreté triedy sú určené na použitie, keď existuje veľmi konkrétny súbor možných možností pre hodnotu a kde je každá z týchto možností funkčne odlišná - iba algebraické dátové typy.

Medzi bežné prípady použitia môže patriť implementácia State Machine alebo v Monadic Programming, ktoré sú s príchodom konceptov funkčného programovania čoraz populárnejšie.

Kedykoľvek máte viac možností a líšia sa iba významom údajov, môže byť lepšie použiť triedy Enum.

Kedykoľvek máte neznámy počet možností, nemôžete použiť zapečatenú triedu, pretože to vám zastaví pridávanie možností mimo pôvodného zdrojového súboru.

4. Písanie zapečatených tried

Začnime tým, že napíšeme našu vlastnú zapečatenú triedu - dobrým príkladom takejto zapečatenej hierarchie je Voliteľné z Java 8 - čo môže byť buď Niektoré alebo Žiadne.

Pri implementácii má veľký zmysel obmedziť možnosť vytvárania nových implementácií - dve poskytované implementácie sú vyčerpávajúce a nikto by nemal pridávať tie svoje.

Ako také môžeme implementovať toto:

zapečatená trieda Voliteľné {// ... abstraktné zábavné isPresent (): Boolean} dátová trieda Niektoré (hodnota val: V): Voliteľné () {// ... prepísať zábavu isPresent (): Boolean = true} trieda Žiadne: Voliteľné () {// ... prepísať zábavu isPresent (): Boolean = false}

Teraz je možné zaručiť, že kedykoľvek budete mať inštanciu Voliteľné, vlastne máte buď a Niektoré alebo Žiadny.

V prostredí Java 8 vyzerá skutočná implementácia inak kvôli absencii zapečatených tried.

Toto potom môžeme využiť vo svojich výpočtoch:

výsledok výsledku: Nepovinné = rozdeliť (1, 0) println (result.isPresent ()) if (výsledok je Some) {println (result.value)}

Prvý riadok vráti buď a Niektoré alebo a Žiadne. Potom vydávame výstup bez ohľadu na to, či sme dostali výsledok.

5. Použite s When

Kotlin má podporu pre použitie zapečatených tried vo svojom kedy konštruktov. Pretože vždy existuje presná sada možných podtried, kompilátor vás dokáže varovať, ak sa s niektorou vetvou nespracuje, a to rovnakým spôsobom, ako to robí pri výpočtoch.

To znamená, že v takýchto situáciách obvykle nie je potrebný obslužný program typu catch-all, čo zase znamená, že pridanie novej podtriedy je automaticky bezpečné - kompilátor vás okamžite upozorní, ak ste s ním nepracovali, a budete potrebovať pred pokračovaním tieto chyby opraviť.

Vyššie uvedený príklad je možné rozšíriť na výstup buď výsledku, alebo chyby v závislosti od vráteného typu:

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

Ak by niektorá z týchto dvoch vetiev chýbala, kompilácia by sa nezkompilovala a namiesto toho by došlo k chybe:

výraz „keď“ musí byť vyčerpávajúci, pridať potrebnú vetvu „else“

6. Zhrnutie

Uzavreté triedy môžu byť neoceniteľným nástrojom pre vašu sadu nástrojov pre návrh API. Povolenie známej štruktúrovanej hierarchie tried, ktorá môže byť vždy len jednou z očakávaných skupín tried, môže pomôcť odstrániť z vášho kódu celú skupinu potenciálnych chybových stavov a zároveň uľahčiť čítanie a údržbu.

Útržky kódu ako vždy nájdete na GitHub.


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