Verzegelde lessen in Kotlin

1. Inleiding

Simpel gezegd, de Kotlin-taal heeft een aantal concepten uit andere functionele talen geleend om te helpen bij het schrijven van veiligere en beter leesbare code. Verzegelde hiërarchieën is een van deze concepten.

2. Wat is een verzegelde klasse?

Verzegelde klassen stellen ons in staat om typehiërarchieën te repareren en ontwikkelaars te verbieden nieuwe subklassen te maken.

Ze zijn handig wanneer u een zeer strikte overervingshiërarchie heeft, met een specifieke set mogelijke subklassen en geen andere. De compiler garandeert dat alleen klassen die zijn gedefinieerd in hetzelfde bronbestand als de verzegelde klasse, hiervan kunnen erven.

Verzegelde klassen zijn ook impliciet abstract. Ze moeten in de rest van uw code als zodanig worden behandeld, behalve dat niets anders ze kan implementeren.

In verzegelde klassen kunnen velden en methoden zijn gedefinieerd, waaronder zowel abstracte als geïmplementeerde functies. Dit betekent dat u een basisweergave van de klasse kunt hebben en deze vervolgens kunt aanpassen aan de subklassen.

3. Wanneer verzegelde klassen gebruiken?

Verzegelde klassen zijn ontworpen om te worden gebruikt wanneer er een zeer specifieke reeks mogelijke opties is voor een waarde, en waarbij elk van deze opties functioneel anders is - alleen algebraïsche gegevenstypen.

Veelvoorkomende use-cases zijn bijvoorbeeld het implementeren van een State Machine of in Monadic Programming, dat steeds populairder wordt met de komst van functionele programmeerconcepten.

Elke keer dat u meerdere opties heeft en deze alleen verschillen in de betekenis van de gegevens, kunt u beter Enum Classes gebruiken.

Elke keer dat je een onbekend aantal opties hebt, kun je geen verzegelde klasse gebruiken, omdat je hierdoor geen opties meer toevoegt buiten het originele bronbestand.

4. Verzegelde lessen schrijven

Laten we beginnen met het schrijven van onze eigen verzegelde klasse - het goede voorbeeld van zo'n verzegelde hiërarchie is een Optioneel van Java 8 - wat beide kan zijn Sommige of Geen.

Wanneer u dit implementeert, is het logisch om de mogelijkheid om nieuwe implementaties te maken te beperken - de twee geleverde implementaties zijn uitputtend en niemand zou hun eigen implementaties moeten toevoegen.

Als zodanig kunnen we dit implementeren:

verzegelde klasse Optioneel {// ... abstract fun isPresent (): Boolean} dataklasse Some (waarde waarde: V): Optioneel () {// ... override fun isPresent (): Boolean = true} klasse Geen: Optioneel () {// ... override fun isPresent (): Boolean = false}

Het kan nu worden gegarandeerd dat u op elk moment een exemplaar hebt van Optioneel, je hebt eigenlijk een Sommige of een Geen.

In Java 8 ziet de daadwerkelijke implementatie er anders uit vanwege het ontbreken van verzegelde klassen.

Hier kunnen we dan gebruik van maken in onze berekeningen:

val result: Optioneel = deel (1, 0) println (result.isPresent ()) if (resultaat is Some) {println (result.value)}

De eerste regel retourneert een Sommige of een Geen. Vervolgens voeren we uit of we al dan niet een resultaat hebben.

5. Gebruiken met wanneer

Kotlin heeft ondersteuning voor het gebruik van verzegelde klassen in zijn wanneer constructeert. Omdat er altijd een exacte set van mogelijke subklassen is, de compiler kan u waarschuwen als een branch niet wordt afgehandeld, op precies dezelfde manier als voor opsommingen.

Dit betekent dat er in dergelijke situaties normaal gesproken geen catch-all handler nodig is, wat op zijn beurt betekent dat het toevoegen van een nieuwe subklasse automatisch veilig is - de compiler zal u onmiddellijk waarschuwen als u deze niet hebt afgehandeld, en u zult om dergelijke fouten op te lossen voordat u doorgaat.

Het bovenstaande voorbeeld kan worden uitgebreid om het resultaat of een fout uit te voeren, afhankelijk van het geretourneerde type:

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

Als een van de twee takken zou ontbreken, zou dit niet compileren en in plaats daarvan resulteren in een fout van:

'when' uitdrukking moet uitputtend zijn, voeg de noodzakelijke 'else'-vertakking toe

6. Samenvatting

Verzegelde klassen kunnen een hulpmiddel van onschatbare waarde zijn voor uw API-ontwerptoolbox. Door een bekende, gestructureerde klassenhiërarchie toe te staan ​​die slechts een van de verwachte klassen kan zijn, kunt u een hele reeks potentiële foutcondities uit uw code verwijderen, terwijl de zaken toch gemakkelijk te lezen en te onderhouden zijn.

Zoals altijd zijn codefragmenten te vinden op GitHub.


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