Java - Próbálja ki az erőforrásokkal

1. Áttekintés

A Java-7-ben bevezetett try-with-resources támogatás lehetővé teszi számunkra, hogy deklaráljuk az a próbáld ki blokkolja azzal a biztosítékkal, hogy az erőforrások bezárásra kerülnek a blokk végrehajtása után.

A bejelentett forrásoknak végre kell hajtaniuk a Automatikusan zárható felület.

2. Használata erőforrásokkal próbálkozzon

Egyszerűen fogalmazva, az automatikus bezáráshoz az erőforrást deklarálni és inicializálni kell a próbáld ki, az alábbiak szerint:

próbáld meg (PrintWriter író = new PrintWriter (új fájl ("test.txt"))) {író.println ("Hello World"); } 

3. Csere próbáld kielkapni Val vel erőforrásokkal próbálkozzon

Az új használat egyszerű és kézenfekvő módja erőforrásokkal próbálkozzon a funkcionalitás a hagyományos és a bőbeszédű helyettesítés próbáld meg utolérni Blokk.

Hasonlítsuk össze a következő kódmintákat - először egy tipikus próbáld meg utolérni blokk, majd az új megközelítés, egy egyenértékű try-with-resources blokk használatával:

Szkenner szkenner = null; próbáld ki a {scanner = new Scanner (új Fájl ("test.txt")) parancsot; while (szkenner.hasNext ()) {System.out.println (szkenner.nextLine ()); }} catch (FileNotFoundException e) {e.printStackTrace (); } végül {if (szkenner! = null) {szkenner.zárja (); }}

És íme a szuper tömör megoldás, a try-with-resources segítségével:

try (Szkenner szkenner = új Szkenner (új Fájl ("test.txt")))) {while (szkenner.hasNext ()) {System.out.println (szkenner.nextLine ()); }} catch (FileNotFoundException fnfe) {fnfe.printStackTrace (); }

Itt tovább kutathatja a Scanner osztály.

4. erőforrásokkal próbálkozzon Több erőforrással

Több erőforrás is jól deklarálható az a-ban erőforrásokkal próbálkozzon blokkolja őket pontosvesszővel elválasztva:

próbáld meg (Szkenner szkenner = új Szkenner (új Fájl ("testRead.txt")); PrintWriter író = új PrintWriter (új Fájl ("testWrite.txt")))) {while (szkenner.hasNext ()) {író.print ( szkenner.nextLine ()); }}

5. Egyéni erőforrás Automatikusan zárható

Olyan egyéni erőforrás létrehozása, amelyet a erőforrásokkal próbálkozzon blokk, az osztálynak végre kell hajtania a Bezárható vagy Automatikusan zárható interfészeket, és felülírja a Bezárás módszer:

nyilvános osztály A MyResource megvalósítja az AutoCloseable {@Override public void close () dobja a Kivételt {System.out.println ("Zárt MyResource"); }}

6. Forrászáró megrendelés

Az elsőként meghatározott / megszerzett erőforrásokat utoljára bezárják; nézzünk meg egy példát erre a viselkedésre:

1. forrás:

public class AutoCloseableResourcesFirst valósítja meg az AutoCloseable {public AutoCloseableResourcesFirst () {System.out.println ("Konstruktor -> AutoCloseableResources_First"); } public void doSomething () {System.out.println ("Valami -> AutoCloseableResources_First"); } @Orride public void close () dobja a (z) {System.out.println ("Closed AutoCloseableResources_First") kivételt; }} 

2. forrás:

public class AutoCloseableResourcesSecond megvalósítja az AutoCloseable {public AutoCloseableResourcesSecond () {System.out.println ("Konstruktor -> AutoCloseableResources_Second"); } public void doSomething () {System.out.println ("Valami -> AutoCloseableResources_Second"); } @Orride public void close () dobja a (z) {System.out.println ("Closed AutoCloseableResources_Second") kivételt; }}

Kód:

private void orderOfClosingResources () dobja a Kivételt {try (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst (); AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond ()) {af.doSomething (); as.doSomething (); }} 

Kimenet:

Konstruktor -> AutoCloseableResources_First

Konstruktor -> AutoCloseableResources_Second

Valami -> AutoCloseableResources_First

Valami -> AutoCloseableResources_Second

Zárt AutoCloseableResources_Second

Zárt AutoCloseableResources_First

7. fogás & végül

A erőforrásokkal próbálkozzon Blokk még mindig a fogás és végül blokkok - amely ugyanúgy fog működni, mint egy hagyományos próbáld ki Blokk.

8. Java 9: ​​Hatékonyan véglegesVáltozók

A Java 9 előtt csak friss változókat használhatunk az a-ban erőforrásokkal próbálkozzon Blokk:

próbáld (Szkenner szkenner = új Szkenner (új Fájl ("testRead.txt")); PrintWriter író = új PrintWriter (új Fájl ("testWrite.txt"))) {// kihagyva}

Amint a fentiekből kiderült, ez különösen bonyolult volt több erőforrás deklarálásakor. A Java 9 és a JEP 213 részeként most már használhatjuk végső vagy akár hatékonyan végleges változók a erőforrásokkal próbálkozzon Blokk:

végső szkenner szkenner = új szkenner (új fájl ("testRead.txt")); PrintWriter író = new PrintWriter (új fájl ("testWrite.txt")) próbálkozás (szkenner; író) {// kihagyva}

Leegyszerűsítve: egy változó gyakorlatilag végleges, ha nem változik az első hozzárendelés után, annak ellenére sem, hogy ezt kifejezetten jelölnék végső.

Amint fentebb látható, a scanner változót deklaráljuk végső kifejezetten, így használhatjuk a erőforrásokkal próbálkozzon Blokk. Habár a író változó nem kifejezetten végső, az első feladat után nem változik. Ezért használhatjuk a író változó is.

9. Következtetés

Ebben a cikkben megvitattuk a try-with-erőforrások használatát, a cserét próbáld ki, fogás, és végül erőforrásokkal történő próbálkozással, egyéni erőforrások létrehozásával Automatikusan zárható és az erőforrások bezárásának sorrendje.

A teljes forráskód a példa ebben a GitHub projektben érhető el.