Prøv-med-ressurser i Kotlin

1. Introduksjon

Administrerte språk, for eksempel de som er målrettet mot JVM, håndterer automatisk den vanligste ressursen: minne.

Vi må imidlertid håndtere alle slags ressurser, ikke bare minne: filer, nettverkstilkoblinger, strømmer, vinduer osv. Og akkurat som minne, må de frigjøres når de ikke lenger er nødvendige.

I denne artikkelen skal vi se på hvordan ressurser kan administreres automatisk i Kotlin, og hvordan det skiller seg fra Java's prøve-med-ressurser-konstruksjon.

Hvis du vil hoppe over teorien, kan du hoppe rett til eksemplet.

2. Automatisk ressursadministrasjon

Vi kan skille mellom tre forskjellige faser når vi jobber med ressurser i Java (pseudokode):

ressurs = anskaffe ressurs () prøv {bruk ressurs (ressurs)} til slutt {releaseResource (ressurs)} 

Hvis språket eller biblioteket er ansvarlig for å frigjøre ressursen ( endelig del), så kaller vi det Automatisk ressursadministrasjon. Slike funksjoner avlaster oss fra å måtte huske å frigjøre en ressurs.

Siden ressursadministrasjon vanligvis er knyttet til et blokkomfang, vil vi alltid frigjøres i riktig rekkefølge hvis vi håndterer mer enn én ressurs samtidig.

I Java implementerer objekter som har en ressurs og er kvalifisert for automatisk ressursadministrasjon et bestemt grensesnitt: Lukkbar for I / O-relaterte ressurser og Kan lukkes automatisk.

Også Java 7 ettermonterte den eksisterende Lukkbar grensesnitt for å utvide Kan lukkes automatisk.

Derfor har Kotlin det samme konseptet med ressursinnehavere: det vil si objekter som implementerer enten Lukkbar eller Kan lukkes automatisk.

3. Den bruk Funksjon i Kotlin

For automatisk å administrere ressurser har noen språk en dedikert konstruksjon: Java 7 introduserte prøve-med-ressurser, for eksempel mens C # har ved hjelp av nøkkelord.

Noen ganger tilbyr de oss et mønster, som RAII i C ++. I noen andre tilfeller gir de oss en biblioteksmetode.

Kotlin faller inn under sistnevnte kategori.

Etter design, det har ikke et språk som ligner på prøv-med-ressurser i Java.

I stedet kan vi finne en utvidelsesmetode kalt bruk i standardbiblioteket.

Vi ser nærmere på det senere. Foreløpig trenger vi bare å vite at alle ressursinnehaverobjekter har bruk metode som vi kan påberope oss.

3.1. Hvordan bruke det

Et enkelt eksempel:

valwriter = FileWriter ("test.txt") writer.use {writer.write ("noe")}

Vi kan påberope oss bruk funksjon på ethvert objekt som implementeres Kan lukkes automatisk eller Lukkbar, akkurat som med prøve-med-ressurser i Java.

Metoden tar et lambdauttrykk, utfører det og disponerer ressursen til (ved å ringe Lukk() på den) når utførelse forlater blokken, enten normalt eller med unntak.

Så, i dette tilfellet, etter bruk, de forfatter kan ikke lenger brukes, fordi Kotlin automatisk har lukket den.

3.2. En kortere form

I eksemplet ovenfor brukte vi for klarhetens skyld en variabel kalt forfatter, og dermed skape en lukking.

Derimot, bruk aksepterer et lambdauttrykk med en enkelt parameterobjektet som holder ressursen:

FileWriter ("test.txt"). Bruk {w -> w.write ("noe")}

Inne i blokken kan vi også bruke den implisitte variabelen den:

FileWriter ("test.txt"). Bruk {it.write ("noe")}

Så som vi kan se, trenger vi ikke å gi objektet et eksplisitt navn. Imidlertid er det vanligvis en god ide å være tydelig i stedet for å skrive altfor kortfattet kode.

3.3. Definisjonen av bruk()

La oss se på definisjonen av bruk funksjon i Kotlin, som finnes i standardbiblioteket:

offentlig inline moro T. bruk (blokk: (T) -> R): R.

Vi kan se, i del, det bruk er definert som en utvidelsesfunksjon på Java Lukkbar grensesnitt.

Mer om utvidelsesmetoder finner du i vår innledende artikkel.

Selvfølgelig, den bruk funksjonen er dokumentert som en del av Kotlins standardbibliotek.

3.4. Lukkbar vs. Kan lukkes automatisk

Hvis vi følger eksemplet fra forrige avsnitt nærmere, kan vi se at bruk funksjonssignatur er bare definert på Lukkbar grensesnitt. Dette er fordi Kotlins standardbibliotek retter seg mot Java 6.

I Java-versjoner før 7, Kan lukkes automatisk eksisterte ikke, og selvfølgelig Lukkbar utvidet den ikke.

I praksis klasser som implementeres Kan lukkes automatisk men ikke Lukkbar er sjeldne. Likevel kan vi støte på en av dem.

I så fall må vi bare legge til en avhengighet av Kotlins utvidelser for Java 7, 8 eller hvilken versjon vi målretter mot:

 org.jetbrains.kotlin kotlin-stdlib-jdk8 

Den siste versjonen av avhengigheten finner du på Maven Central.

Det gir oss en til bruk utvidelsesfunksjon definert på Kan lukkes automatisk grensesnitt:

offentlig inline moro T. bruk (blokk: (T) -> R): R.

4. Konklusjon

I denne veiledningen har vi sett hvordan en enkel utvidelsesfunksjon i Kotlins standardbibliotek er alt vi trenger for å administrere alle slags ressurser som er kjent for JVM automatisk.

Implementeringen av alle disse eksemplene og kodebiter finner du i GitHub-prosjektet.


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