Forseglede klasser i Kotlin

1. Introduksjon

Enkelt sagt, Kotlin-språket lånte en rekke konsepter fra andre funksjonelle språk for å hjelpe til med å skrive tryggere og mer lesbar kode. Forseglede hierarkier er et av disse begrepene.

2. Hva er en forseglet klasse?

Forseglede klasser tillater oss å fikse typehierarkier og forby utviklere å lage nye underklasser.

De er nyttige når du har et veldig strengt arvshierarki, med et spesifikt sett med mulige underklasser og ingen andre. Kompilatoren garanterer at bare klasser som er definert i samme kildefil som den forseglede klassen, kan arve fra den.

Forseglede klasser er også implisitt abstrakt. De skal behandles slik gjennom resten av koden din, bortsett fra at ingenting annet er i stand til å implementere dem.

Forseglede klasser kan ha felt og metoder definert i dem, inkludert både abstrakte og implementerte funksjoner. Dette betyr at du kan ha en basisrepresentasjon av klassen og deretter justere den etter underklassene.

3. Når skal jeg bruke forseglede klasser?

Forseglede klasser er designet for å brukes når det er et veldig spesifikt sett med mulige alternativer for en verdi, og hvor hvert av disse alternativene er funksjonelt forskjellige - bare algebraiske datatyper.

Vanlige brukssaker kan omfatte implementering av en statsmaskin eller i Monadic Programming, som blir stadig mer populær med bruk av funksjonelle programmeringskonsepter.

Når du har flere alternativer, og de skiller seg bare ut i betydningen av dataene, kan det være bedre å bruke Enum Classes i stedet.

Hver gang du har et ukjent antall alternativer, kan du ikke bruke en forseglet klasse fordi dette vil stoppe deg med å legge til alternativer utenfor den opprinnelige kildefilen.

4. Skrive forseglede klasser

La oss starte med å skrive vår egen forseglede klasse - det gode eksemplet på et slik forseglet hierarki er et Valgfri fra Java 8 - som kan være en av dem Noen eller Ingen.

Når du implementerer dette, er det veldig fornuftig å begrense muligheten for å lage nye implementeringer - de to medfølgende implementeringene er uttømmende og ingen skal legge til sine egne.

Som sådan kan vi implementere dette:

forseglet klasse Valgfritt {// ... abstrakt moro isPresent (): Boolsk} dataklasse Noen (val verdi: V): Valgfritt () {// ... overstyr moro isPresent (): Boolsk = sann} klasse Ingen: Valgfritt () {// ... overstyr moro isPresent (): boolsk = falsk}

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

I Java 8 ser den faktiske implementeringen annerledes ut på grunn av fraværet av forseglede klasser.

Vi kan da bruke dette i beregningene våre:

val result: Valgfritt = divide (1, 0) println (result.isPresent ()) if (result is Some) {println (result.value)}

Den første linjen vil enten returnere a Noen eller a Ingen. Vi sender deretter ut om vi fikk et resultat eller ikke.

5. Bruk med når

Kotlin har støtte for bruk av forseglede klasser i sin når konstruerer. Fordi det alltid er et nøyaktig sett med mulige underklasser, kompilatoren er i stand til å advare deg hvis en gren ikke blir håndtert, på nøyaktig samme måte som den gjør for oppregninger.

Dette betyr at det i slike situasjoner normalt ikke er behov for en catch-all handler, noe som igjen betyr at det å legge til en ny underklasse automatisk er trygt - kompilatoren vil umiddelbart advare deg hvis du ikke har håndtert det, og du trenger for å fikse slike feil før du fortsetter.

Ovennevnte eksempel kan utvides til å levere enten resultatet eller en feil, avhengig av typen som returneres:

val melding = når (resultat) {er Noen -> "Svar: $ {resultat.verdi}" er Ingen -> "Ingen resultater"} println (melding)

Hvis en av de to grenene manglet, ville dette ikke kompilere og i stedet resultere i en feil på:

'når' uttrykk må være uttømmende, legg til nødvendig 'annet' gren

6. Sammendrag

Forseglede klasser kan være et uvurderlig verktøy for API-designverktøykassen din. Å tillate et velkjent, strukturert klassehierarki som bare noen gang kan være et av et forventet sett med klasser, kan bidra til å fjerne et helt sett med potensielle feilforhold fra koden din, samtidig som det blir enkelt å lese og vedlikeholde.

Som alltid kan du finne kodebiter på GitHub.


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