Próbáld ki az erőforrásokat Kotlinban
1. Bemutatkozás
A kezelt nyelvek, például a JVM-et célzó nyelvek, automatikusan kezelik a leggyakoribb erőforrást: a memóriát.
Azonban mindenféle erőforrással kell foglalkoznunk, nem csak a memóriával: fájlokkal, hálózati kapcsolatokkal, adatfolyamokkal, ablakokkal stb. akárcsak az emlékezet, ezeket is fel kell szabadítani, amikor már nincs rá szükség.
Ebben a cikkben azt fogjuk megvizsgálni, hogy az erőforrások hogyan kezelhetők automatikusan Kotlinban, és miben különbözik a Java erőforrásokkal próbálkozó konstrukciójától.
Ha át akarja hagyni az elméletet, ugorjon közvetlenül a példára.
2. Automatikus erőforrás-kezelés
Három különböző fázist különböztethetünk meg, ha a Java erőforrásaival dolgozunk (álkód):
erőforrás = acquResource () próbáld meg {useResource (erőforrás)} végül {releaseResource (erőforrás)}
Ha a nyelv vagy a könyvtár felelős az erőforrás (a végül rész), akkor hívjuk Automatikus erőforrás-kezelés. Ilyen jellemző felment minket attól, hogy emlékeznünk kell egy erőforrás felszabadítására.
Továbbá, mivel az erőforrás-kezelés általában blokkkörhöz van kötve, ha egyszerre több erőforrással is foglalkozunk, akkor azok mindig a megfelelő sorrendben kerülnek kiadásra.
A Java-ban az erőforrást tároló objektumok, amelyek jogosultak az automatikus erőforrás-kezelésre, egy adott felületet valósítanak meg: Bezárható az I / O-val kapcsolatos erőforrásokhoz és Automatikusan zárható.
Ezenkívül a Java 7 utólag szerelte fel a már létezőt Bezárható felület kiterjesztésére Automatikusan zárható.
Ezért Kotlin ugyanazzal az erőforrástulajdonos-koncepcióval rendelkezik: vagyis bármelyik megvalósító objektum Bezárható vagy Automatikusan zárható.
3. Az használat Funkció Kotlinban
Az erőforrások automatikus kezeléséhez egyes nyelveknek külön dedikált konstrukciója van: a Java 7 például bevezette az erőforrásokkal való próbálkozást, míg a C # felhasználásával kulcsszó.
Néha kínálnak nekünk egy mintát, például RAII-t a C ++ -ban. Néhány más esetben könyvtármódszert adnak nekünk.
Kotlin az utóbbi kategóriába tartozik.
Tervezés szerint nincs ehhez hasonló nyelvi konstrukciója erőforrásokkal próbálkozzon Java-ban.
Ehelyett megtalálhatjuk az úgynevezett kiterjesztési módszert használat szokásos könyvtárában.
Később részletesen megvizsgáljuk. Egyelőre csak tudnunk kell, hogy minden erőforrástulajdonos objektum rendelkezik a használat módszer, amelyre hivatkozhatunk.
3.1. Hogyan kell használni
Egy egyszerű példa:
val író = FileWriter ("test.txt") író.használja {író.írja ("valami")}
Felhívhatjuk a használat funkció bármely objektumon, amely megvalósul Automatikusan zárható vagy Bezárható, csakúgy, mint a Java-ban próbáld ki az erőforrásokat.
A módszer vesz egy lambda kifejezést, végrehajtja és elidegeníti az erőforrást (meghívással Bezárás() rajta), valahányszor a végrehajtás elhagyja a blokkot, normálisan vagy kivétellel.
Tehát ebben az esetben utána használat, a író már nem használható, mert Kotlin automatikusan bezárta.
3.2. Rövidebb űrlap
A fenti példában az érthetőség kedvéért egy változót hívtunk író, ezáltal bezárást hozva létre.
Azonban, használat egyetlen paraméterrel elfogadja a lambda kifejezést – az erőforrást tároló objektum:
FileWriter ("test.txt") .use {w -> w.write ("valami")}
A blokkon belül használhatjuk az implicit változót is azt:
FileWriter ("test.txt") .use {it.write ("valami")}
Tehát, mint láthatjuk, nem kell explicit nevet adnunk az objektumnak. Általában azonban jó, ha világos, nem pedig túl tömör kód írása.
3.3. A meghatározás használat()
Nézzük meg a használat funkció Kotlinban, amint az a szokásos könyvtárban található:
nyilvános inline szórakozás T.használat (blokk: (T) -> R): R
Láthatjuk, a rész, az használat a Java-k kiterjesztési függvényeként van meghatározva Bezárható felület.
A kiterjesztési módszerekről bővebben a bevezető cikkünkben találhatók.
Természetesen a használat függvényt dokumentálják a Kotlin standard könyvtárának részeként.
3.4. Bezárható vs. Automatikusan zárható
Ha jobban figyelünk az előző szakasz példájára, láthatjuk, hogy a használat a funkció aláírását csak a Bezárható felület. Ennek oka, hogy a Kotlin szabványos könyvtárának célja a Java 6.
7 előtti Java verziókban, Automatikusan zárható nem létezett, és természetesen Bezárható nem hosszabbította meg.
A gyakorlatban olyan osztályok, amelyek megvalósítják Automatikusan zárható de nem Bezárható ritkák. Ennek ellenére találkozhatunk egyikükkel.
Ebben az esetben csak a Kotlin Java 7, 8 vagy bármilyen más célzott verziójának kiterjesztését kell hozzáadnunk:
org.jetbrains.kotlin kotlin-stdlib-jdk8
A függőség legújabb verziója a Maven Central oldalon található.
Ez ad nekünk egy másikat használat kiterjesztési függvény a Automatikusan zárható felület:
nyilvános inline szórakozás T.használat (blokk: (T) -> R): R
4. Következtetés
Ebben az oktatóanyagban azt láthattuk, hogy a Kotlin szabványos könyvtárának egyszerű kiterjesztési funkciója mennyire szükséges a JVM által ismert mindenféle erőforrás automatikus kezeléséhez.
Mindezen példák és kódrészletek megvalósítása megtalálható a GitHub projektben.