Forseglede klasser i Kotlin er et annet nytt konsept vi ikke hadde I Java, og åpner en annen ny verden av muligheter.
en forseglet klasse lar deg representere begrensede hierarkier der et objekt bare kan være av en av de gitte typene.
Det vil si at vi har en klasse med et bestemt antall underklasser. Det vi får til slutt er et konsept som ligner på en enum. Forskjellen er at i enum har vi bare ett objekt per type, mens i de forseglede klassene kan vi ha flere objekter av samme klasse.
denne forskjellen vil tillate objekter fra en forseglet klasse å beholde tilstanden. Dette vil gi oss noen fordeler som vi ser om et øyeblikk, og åpner også dørene til noen funksjonelle ideer.
slik bruker du forseglede klasser
Implementering av en forseglet klasse er faktisk veldig enkel. La oss bruke som et eksempel et sett med operasjoner som kan brukes på heltall.
implementeringen vil være som følger:
vi lager en forseglet klasse kalt Operation
, som inneholder fire typer operasjoner: addisjon, subtraksjon, multiplikasjon og divisjon.
det gode med dette er at nå when
uttrykk vil kreve at vi gir grener for alle mulige typer:

Vil du lære Kotlin?
Sjekk min gratis guide for å lage ditt første prosjekt i 15 minutter!
hvis du lar noen av underklassene være ute, vil when
klage og det vil ikke kompilere. Hvis du implementerer dem alle, trenger du ikke else
– setningen. Og generelt vil det ikke bli anbefalt fordi på den måten er vi sikre på at vi gjør det rette for dem alle.
Dette er også flott hvis du bestemmer deg for å legge til en ny operasjon, fordi den vil mislykkes ved kompileringstid og ikke vil kjøre. Legg til et par flere operasjoner: økning og reduksjon:
sealed class Operation { ... object Increment : Operation() object Decrement : Operation()}
du vil se at kompilatoren nå advarer deg om at det er et problem. Bare legg til grener for disse nye operasjonene:
fun execute(x: Int, op: Operation) = when (op) { ... Operation.Increment -> x + 1 Operation.Decrement -> x - 1}
Du har kanskje lagt merke til at jeg gjorde noe annerledes. Jeg brukte objekter i stedet for klasser. Dette skyldes at hvis en underklasse ikke holder tilstand, kan det bare være et objekt. Alle forekomstene du oppretter for den klassen, vil være nøyaktig det samme, da de ikke kan ha forskjellig tilstand.
i uttrykket when
kan du kvitte deg med is
for de tilfellene. Her kan du bare sammenligne objektet, da det bare er en forekomst, trenger du ikke å sjekke objekttypen. Det ville fungere også hvis du holder is
for de også.
hvis du tenker på det nøye, vil en forseglet klasse der alle underklasser er objekter være det samme som en enum.
Flytte bivirkninger til et enkelt punkt
Bivirkninger Er et svært gjentakende konsept i funksjonell programmering. Funksjonell programmering er avhengig av ideen om at for en gitt funksjon vil samme parametere returnere det samme resultatet.
enhver tilstand som er endret kan bryte denne antakelsen. Men ethvert program må endre stater, kommunisere med inngangs – / utgangselementer, etc. Så det er viktig å få øye på disse operasjonene svært spesifikke steder i koden vår som lett kan isoleres.
for eksempel kan alle operasjoner utført På En Android-visning betraktes som en bivirkning, da statusen til visningene blir endret og funksjonene ikke er klar over det.
Vi kunne lage en forseglet klasse som ville tillate oss å gjøre operasjoner på våre synspunkter. Basert på ideen om vårt tidligere eksempel:
Husk: operasjoner som ikke har noen tilstand, kan være objekter, fordi vi ikke trenger forskjellige forekomster.
nå kan du opprette et Ui
objekt som samler alle grensesnittoperasjoner som vi vil gjøre over en visning, men det vil ikke utføre dem til det øyeblikket vi ønsker.
vi har en beskrivelse av hva vi vil gjøre, og da kan vi lage en komponent som utfører dem:
class Ui(val uiOps: List = emptyList()) { operator fun plus(uiOp: UiOp) = Ui(uiOps + uiOp)}
klassen Ui
lagrer en liste over operasjoner, og angir en sum operatør som vil bidra til å gjøre alt litt renere og enklere å lese. Nå kan vi spesifisere listen over operasjoner som vi ønsker å utføre:
val ui = Ui() + UiOp.Show + UiOp.TranslateX(20f) + UiOp.TranslateY(40f) + UiOp.Hiderun(view, ui)
og kjør den deretter. Her bruker jeg bare en run
– funksjon, men dette kan være en komplett klasse hvis nødvendig.
fun run(view: View, ui: Ui) { ui.uiOps.forEach { execute(view, it) }}
Tenk deg kraften som gir deg dette. Akkurat nå er alt du gjør, å kjøre operasjonene i rekkefølge, men dette kan være så komplisert som nødvendig.
denne run
– funksjonen kan sendes til en annen funksjon eller en klasse, og måten disse operasjonene kjøres på, vil være helt utskiftbare. Husk at du kan passere funksjoner som argumenter.
Konklusjon
konseptet med de forseglede klassene er veldig enkelt, men det er grunnlaget for mange nye ideer du trenger å bli brukt hvis du ikke har spilt med funksjonell programmering før.
jeg må si at jeg ennå ikke er i stand til å få mest mulig ut av sealed classed på grunn av mine kunnskapsbegrensninger i funksjonell programmering.
Hvis alt dette lidenskapelig du som til meg, oppfordrer jeg deg til å registrere deg for min gratis trening der jeg vil fortelle deg alt du trenger for å lære om hvordan du oppretter Din Android Apps I Kotlin fra bunnen av.