Vyskúšajte zdroje v Kotline

1. Úvod

Spravované jazyky, napríklad jazyky zacielené na JVM, automaticky spracúvajú najbežnejší zdroj: pamäť.

Musíme sa však zaoberať všetkými druhmi zdrojov, nielen pamäťou: súbormi, sieťovými pripojeniami, prúdmi, oknami atď. A, rovnako ako pamäť, aj tie je potrebné uvoľniť, keď už nie sú potrebné.

V tomto článku sa pozrieme na to, ako je možné automaticky spravovať zdroje v Kotline a ako sa líši od konštrukcie typu try-with-resources Java.

Ak chcete preskočiť teóriu, choďte priamo k príkladu.

2. Automatická správa zdrojov

Pri práci s prostriedkami v Jave (pseudokód) môžeme rozlíšiť tri rôzne fázy:

resource = obtainResource () vyskúšajte {useResource (zdroj)} konečne {releaseResource (zdroj)} 

Ak je jazyk alebo knižnica zodpovedná za uvoľnenie zdroja (ďalej len konečne časť), potom to nazveme Automatická správa zdrojov. Takáto vlastnosť zbavuje nás povinnosti pamätať na uvoľnenie zdroja.

Pretože správa zdrojov je zvyčajne viazaná na rozsah blokov, ak pracujeme s viac ako jedným zdrojom súčasne, budú vydané vždy v správnom poradí.

V prostredí Java objekty, ktoré obsahujú zdroj a sú vhodné na automatickú správu zdrojov, implementujú konkrétne rozhranie: Uzatvárateľné pre zdroje súvisiace s I / O a Automatické uzatváranie.

Java 7 tiež dovybavil už existujúce Uzatvárateľné rozhranie rozšíriť Automatické uzatváranie.

Preto má Kotlin rovnaký koncept držiteľov prostriedkov: teda objekty implementujúce buď Uzatvárateľné alebo Automatické uzatváranie.

3. The použitie Funkcia v Kotline

Na automatickú správu prostriedkov majú niektoré jazyky vyhradenú konštrukciu: Java 7 napríklad uviedla try-with-resources, zatiaľ čo C # má použitím kľúčové slovo.

Niekedy nám ponúknu vzor, ​​napríklad RAII v C ++. V niektorých iných prípadoch nám dajú knižničnú metódu.

Kotlin spadá do druhej kategórie.

Podľa návrhu nemá podobný jazykový konštrukt vyskúšajte zdroje v Jave.

Namiesto toho môžeme nájsť metódu rozšírenia s názvom použitie v jeho štandardnej knižnici.

Neskôr sa na to pozrieme podrobne. Zatiaľ potrebujeme len vedieť, že každý objekt držiteľa prostriedkov má použitie metóda, ktorú môžeme vyvolať.

3.1. Ako sa to používa

Jednoduchý príklad:

val writer = FileWriter ("test.txt") writer.use {writer.write ("niečo")}

Môžeme vyvolať použitie funkciu na akomkoľvek objekte, ktorý implementuje Automatické uzatváranie alebo Uzatvárateľné, rovnako ako v prípade zdrojov vyskúšaných v Jave.

Metóda vezme lambda výraz, vykoná ho a zbaví sa prostriedku (volaním Zavrieť() na ňom) vždy, keď vykonanie opustí blok, buď normálne, alebo s výnimkou.

Takže v tomto prípade po použitie, the spisovateľka už nie je použiteľný, pretože Kotlin ho automaticky uzavrel.

3.2. Kratšia forma

Vo vyššie uvedenom príklade sme kvôli prehľadnosti použili premennú s názvom spisovateľka, čím sa vytvorí uzávierka.

Avšak použitie prijíma výraz lambda s jediným parametromobjekt držiaci zdroj:

FileWriter ("test.txt") .use {w -> w.write ("niečo")}

Vo vnútri bloku môžeme tiež použiť implicitnú premennú to:

FileWriter ("test.txt") .use {it.write ("niečo")}

Ako teda vidíme, nemusíme dať objektu explicitný názov. Spravidla je však dobré mať jasno a nie písať príliš výstižný kód.

3.3. Definícia použitie ()

Pozrime sa na definíciu použitie funkcia v Kotline, ako sa nachádza v jeho štandardnej knižnici:

verejná inline zábava T.use (blok: (T) -> R): R

Môžeme vidieť, v časť, že použitie je definovaná ako funkcia rozšírenia v prostredí Java Uzatvárateľné rozhranie.

Viac o metódach rozšírenia nájdete v našom úvodnom článku.

Samozrejme, že použitie funkcia je zdokumentovaná ako súčasť štandardnej Kotlinovej knižnice.

3.4. Uzatvárateľné vs Automatické uzatváranie

Ak sa bližšie pozrieme na príklad z predchádzajúcej časti, môžeme vidieť, že použitie podpis funkcie je definovaný iba na Uzatvárateľné rozhranie. Je to tak preto, lebo štandardná Kotlinova knižnica je zameraná na Javu 6.

Vo verziách Java pred 7, Automatické uzatváranie neexistovali a samozrejme Uzatvárateľné nerozšíril to.

V praxi triedy, ktoré realizujú Automatické uzatváranie ale nie Uzatvárateľné sú zriedkavé. Napriek tomu sa s jedným z nich môžeme stretnúť.

V takom prípade musíme iba pridať závislosť na rozšíreniach Kotlin pre Java 7, 8 alebo na akúkoľvek verziu, na ktorú zacieľujeme:

 org.jetbrains.kotlin kotlin-stdlib-jdk8 

Najnovšiu verziu závislosti nájdete na serveri Maven Central.

To nám dáva ďalšie použitie rozširujúca funkcia definovaná na Automatické uzatváranie rozhranie:

verejná inline zábava T.use (blok: (T) -> R): R

4. Záver

V tomto tutoriáli sme videli, ako jednoduchá funkcia rozšírenia v štandardnej knižnici Kotlin všetko, čo potrebujeme na automatické spravovanie všetkých druhov zdrojov známych JVM.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete v projekte GitHub.