Pokušajte s resursima u Kotlinu

1. Uvod

Upravljani jezici, poput onih koji ciljaju JVM, automatski obrađuju najčešći resurs: memoriju.

Međutim, moramo se baviti svim vrstama resursa, a ne samo memorijom: datotekama, mrežnim vezama, streamovima, prozorima itd. I, baš kao i memorija, i njih treba osloboditi kad više nisu potrebne.

U ovom ćemo članku pogledati kako se resursima može automatski upravljati u Kotlinu i kako se to razlikuje od Javine konstrukcije try-with-resources.

Ako želite preskočiti teoriju, prijeđite ravno na primjer.

2. Automatsko upravljanje resursima

Tijekom rada s resursima u Javi možemo razlikovati tri različite faze (pseudokod):

resource = придобиtiResource () isprobati {useResource (resource)} napokon {releaseResource (resource)} 

Ako je jezik ili knjižnica odgovoran za objavljivanje resursa ( konačno dio), tada ga nazivamo Automatsko upravljanje resursima. Takva značajka oslobađa nas potrebe da se ne zaboravimo osloboditi resursa.

Također, budući da je upravljanje resursima obično povezano s opsegom bloka, ako istovremeno radimo s više resursa, oni će se uvijek objaviti u ispravnom redoslijedu.

U Javi objekti koji sadrže resurs i koji ispunjavaju uvjete za automatsko upravljanje resursima implementiraju određeno sučelje: Može se zatvoriti za I / O resurse i AutoCloseable.

Također, Java 7 je unaprijedila postojeće Može se zatvoriti sučelje za proširenje AutoCloseable.

Prema tome, Kotlin ima isti koncept nositelja resursa: odnosno objekata koji implementiraju bilo koji Može se zatvoriti ili AutoCloseable.

3. The koristiti Funkcija u Kotlinu

Za automatsko upravljanje resursima neki jezici imaju namjensku konstrukciju: Java 7 je, na primjer, uvela try-with-resources, dok C # ima koristeći ključna riječ.

Ponekad nam ponude obrazac, poput RAII u C ++. U nekim drugim slučajevima daju nam knjižničnu metodu.

Kotlin spada u potonju kategoriju.

Po dizajnu, to nema jezičnu konstrukciju srodnu s pokušajte s resursima na Javi.

Umjesto toga, možemo pronaći metodu produženja koja se naziva koristiti u svojoj standardnoj knjižnici.

Detaljno ćemo to pogledati kasnije. Za sada samo trebamo znati da svaki objekt imatelja resursa ima koristiti metoda na koju se možemo pozvati.

3.1. Kako ga koristiti

Jednostavan primjer:

val Writer = FileWriter ("test.txt") writer.use {writer.write ("nešto")}

Možemo se pozvati na koristiti funkcija na bilo kojem objektu koji se provodi AutoCloseable ili Može se zatvoriti, baš kao i kod try-with-resources u Javi.

Metoda uzima lambda izraz, izvršava ga i raspolaže resursom (pozivanjem Zatvoriti() na njemu) kad god izvršenje napusti blok, bilo normalno ili s iznimkom.

Dakle, u ovom slučaju, nakon koristiti, the pisac više nije upotrebljiv, jer ga je Kotlin automatski zatvorio.

3.2. Kraći obrazac

U gornjem primjeru, radi preglednosti, koristili smo varijablu tzv pisac, stvarajući tako zatvaranje.

Međutim, koristiti prihvaća lambda izraz s jednim parametromobjekt koji drži resurs:

FileWriter ("test.txt") .use {w -> w.write ("nešto")}

Unutar bloka možemo koristiti i implicitnu varijablu to:

FileWriter ("test.txt") .use {it.write ("something")}

Dakle, kao što vidimo, ne moramo objektu dati eksplicitno ime. Međutim, obično je dobra ideja biti jasan, a ne pisati pretjerano sažet kôd.

3.3. Definicija koristiti()

Pogledajmo definiciju koristiti funkcija u Kotlinu, kako se nalazi u njegovoj standardnoj knjižnici:

javna inline zabava T.koristiti (blok: (T) -> R): R

Možemo vidjeti u dio, taj koristiti definira se kao funkcija proširenja na Javi Može se zatvoriti sučelje.

Više o metodama produženja možete pronaći u našem uvodnom članku.

Naravno, koristiti funkcija dokumentirana je kao dio Kotlinove standardne knjižnice.

3.4. Može se zatvoriti nasuprot AutoCloseable

Ako pažljivije obratimo pozornost na primjer iz prethodnog odjeljka, možemo vidjeti da koristiti potpis funkcije definiran je samo na Može se zatvoriti sučelje. To je zato što Kotlinova standardna knjižnica cilja Java 6.

U inačicama Java prije 7, AutoCloseable nije postojalo i, naravno, Može se zatvoriti nije produžio.

U praksi satovi koji provode AutoCloseable ali ne Može se zatvoriti su rijetki. Ipak, možemo se susresti s jednim od njih.

U tom slučaju moramo dodati samo ovisnost o Kotlinovim proširenjima za Javu 7, 8 ili bilo koju verziju koju ciljamo:

 org.jetbrains.kotlin kotlin-stdlib-jdk8 

Najnoviju verziju ovisnosti možete pronaći na Maven Central.

To nam daje još jedno koristiti funkcija proširenja definirana na AutoCloseable sučelje:

javna inline zabava T.koristite (blok: (T) -> R): R

4. Zaključak

U ovom uputstvu vidjeli smo kako je jednostavna funkcija proširenja u standardnoj knjižnici Kotlina sve što nam treba za automatsko upravljanje svim vrstama resursa poznatih JVM-u.

Provedbu svih ovih primjera i isječaka koda možete pronaći u projektu GitHub.


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