Forseglede klasser i Kotlin

1. Introduktion

Kort sagt, Kotlin-sproget lånte en række koncepter fra andre funktionelle sprog for at hjælpe med at skrive en mere sikker og mere læselig kode. Forseglede hierarkier er et af disse begreber.

2. Hvad er en forseglet klasse?

Forseglede klasser giver os mulighed for at rette typehierarkier og forbyde udviklere at oprette nye underklasser.

De er nyttige, når du har et meget strengt arvshierarki med et specifikt sæt mulige underklasser og ingen andre. Compileren garanterer, at kun klasser defineret i den samme kildefil som den forseglede klasse er i stand til at arve fra den.

Forseglede klasser er også implicit abstrakt. De skal behandles som sådan i resten af ​​din kode, bortset fra at intet andet er i stand til at implementere dem.

Forseglede klasser kan have defineret felter og metoder, herunder både abstrakte og implementerede funktioner. Dette betyder, at du kan have en basisrepræsentation af klassen og derefter justere den, så den passer til underklasserne.

3. Hvornår skal man bruge forseglede klasser?

Forseglede klasser er designet til at blive brugt, når der er et meget specifikt sæt mulige muligheder for en værdi, og hvor hver af disse muligheder er forskellige - bare algebraiske datatyper.

Almindelige anvendelsessager kan omfatte implementering af en statsmaskine eller i monadisk programmering, som bliver stadig mere populær med fremkomsten af ​​funktionelle programmeringskoncepter.

Når du har flere muligheder, og de adskiller sig kun i betydningen af ​​dataene, kan det være bedre for dig at bruge Enum-klasser i stedet.

Når du har et ukendt antal muligheder, kan du ikke bruge en forseglet klasse, fordi dette stopper dig med at tilføje muligheder uden for den oprindelige kildefil.

4. Skrivning af forseglede klasser

Lad os starte med at skrive vores egen forseglede klasse - det gode eksempel på et sådant forseglet hierarki er et Valgfri fra Java 8 - som kan være enten Nogle eller Ingen.

Når det implementeres, giver det meget mening at begrænse muligheden for at oprette nye implementeringer - de to forudsatte implementeringer er udtømmende, og ingen skal tilføje deres egne.

Som sådan kan vi implementere dette:

forseglet klasse Valgfri {// ... abstrakt sjov isPresent (): Boolsk} dataklasse Nogle (val værdi: V): Valgfri () {// ... tilsidesætter sjov isPresent (): Boolsk = sand} klasse Ingen: Valgfri () {// ... tilsidesætte sjov isPresent (): boolsk = falsk}

Det kan nu garanteres, at når som helst du har en forekomst af Valgfri, har du faktisk enten en Nogle eller en Ingen.

I Java 8 ser den faktiske implementering anderledes ud på grund af fraværet af forseglede klasser.

Vi kan derefter gøre brug af dette i vores beregninger:

val resultat: Valgfri = del (1, 0) println (result.isPresent ()) hvis (resultatet er Noget) {println (result.value)}

Den første linje returnerer enten a Nogle eller a Ingen. Vi sender derefter ud, om vi fik et resultat eller ej.

5. Brug med hvornår

Kotlin har støtte til at bruge forseglede klasser i sin hvornår konstruerer. Fordi der altid er et nøjagtigt sæt mulige underklasser, compileren er i stand til at advare dig, hvis en filial ikke håndteres på nøjagtig samme måde, som den gør for optællinger.

Det betyder, at der i sådanne situationer normalt ikke er behov for en catch-all-handler, hvilket igen betyder, at tilføjelse af en ny underklasse automatisk er sikker - compileren advarer dig straks, hvis du ikke har håndteret det, og du får brug for at rette sådanne fejl, inden du fortsætter.

Ovenstående eksempel kan udvides til enten at resultere i resultatet eller en fejl afhængigt af den returnerede type:

val besked = når (resultat) {er noget -> "Svar: $ {resultat.værdi}" er Ingen -> "Intet resultat"} println (besked)

Hvis en af ​​de to grene manglede, ville dette ikke kompilere og i stedet resultere i en fejl på:

'når' udtryk skal være udtømmende, tilføj den nødvendige 'andet' gren

6. Resume

Forseglede klasser kan være et uvurderligt værktøj til din API-designværktøjskasse. At tillade et velkendt, struktureret klassehierarki, der kun nogensinde kan være et af et forventet sæt klasser, kan hjælpe med at fjerne et helt sæt potentielle fejlforhold fra din kode, mens det stadig gør tingene lette at læse og vedligeholde.

Som altid kan kodeuddrag findes på GitHub.


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