Java - pokušajte s resursima

1. Pregled

Podrška za try-with-resources - uvedena u Javi 7 - omogućuje nam prijavljivanje resursa koji će se koristiti u a probati blok s jamstvom da će se resursi zatvoriti nakon izvršenja tog bloka.

Deklarirani resursi moraju implementirati AutoCloseable sučelje.

2. Korištenje pokušajte s resursima

Jednostavno rečeno, da bi se izvor automatski zatvorio, resurs mora biti deklariran i inicijaliziran unutar probati, kako je prikazano dolje:

probajte (PrintWriter Writer = novi PrintWriter (nova datoteka ("test.txt"))) {writer.println ("Hello World"); } 

3. Zamjena probatiuhvatiti-konačno S pokušajte s resursima

Jednostavan i očit način korištenja novog pokušajte s resursima funkcionalnost je zamjena tradicionalnog i opširnog probaj-uhvati-napokon blok.

Usporedimo sljedeće uzorke koda - prvi je tipičan probaj-uhvati-napokon blok, a zatim novi pristup, koristeći ekvivalentni blok try-with-resources:

Skener skenera = null; isprobajte {scanner = new Scanner (nova datoteka ("test.txt")); while (scanner.hasNext ()) {System.out.println (scanner.nextLine ()); }} catch (FileNotFoundException e) {e.printStackTrace (); } konačno {if (skener! = null) {scanner.close (); }}

I evo super sažetog rješenja pomoću try-with-resources:

pokušajte (Scanner scanner = novi Scanner (nova datoteka ("test.txt"))) {while (scanner.hasNext ()) {System.out.println (scanner.nextLine ()); }} catch (FileNotFoundException fnfe) {fnfe.printStackTrace (); }

Ovdje možete dalje istražiti Skener razred.

4. pokušajte s resursima S više resursa

Višestruki resursi mogu se proglasiti u redu u a pokušajte s resursima blok razdvajajući ih zarezom:

probajte (Scanner scanner = novi Scanner (nova datoteka ("testRead.txt")); PrintWriter Writer = novi PrintWriter (nova datoteka ("testWrite.txt"))) {while (scanner.hasNext ()) {writer.print ( scanner.nextLine ()); }}

5. Prilagođeni resurs sa AutoCloseable

Za konstrukciju prilagođenog resursa s kojim će a. Ispravno rukovati pokušajte s resursima blok, klasa bi trebala implementirati Može se zatvoriti ili AutoCloseable sučelja i nadjačati Zatvoriti metoda:

javna klasa MyResource implementira AutoCloseable {@Override public void close () baca izuzetak {System.out.println ("Closed MyResource"); }}

6. Nalog za zatvaranje resursa

Resursi koji su prvi definirani / nabavljeni bit će zadnji zatvoreni; pogledajmo primjer takvog ponašanja:

Izvor 1:

javna klasa AutoCloseableResourcesFirst implementira AutoCloseable {public AutoCloseableResourcesFirst () {System.out.println ("Konstruktor -> AutoCloseableResources_First"); } javna void doSomething () {System.out.println ("Nešto -> AutoCloseableResources_First"); } @Override public void close () baca izuzetak {System.out.println ("Closed AutoCloseableResources_First"); }} 

Izvor 2:

javna klasa AutoCloseableResourcesSecond implementira AutoCloseable {public AutoCloseableResourcesSecond () {System.out.println ("Konstruktor -> AutoCloseableResources_Second"); } javna void doSomething () {System.out.println ("Nešto -> AutoCloseableResources_Second"); } @Override public void close () baca izuzetak {System.out.println ("Closed AutoCloseableResources_Second"); }}

Kodirati:

private void orderOfClosingResources () baca izuzetak {try (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst (); AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond ()) {af.doSomething (); as.doSomething (); }} 

Izlaz:

Konstruktor -> AutoCloseableResources_First

Konstruktor -> AutoCloseableResources_Second

Nešto -> AutoCloseableResources_First

Nešto -> AutoCloseableResources_Second

Zatvoreno AutoCloseableResources_Second

Zatvoreno AutoCloseableResources_First

7. ulov & konačno

A pokušajte s resursima blok još uvijek mogu imati ulov i konačno blokovi - koji će raditi na isti način kao i kod tradicionalnih probati blok.

8. Java 9: ​​Djelotvorno konačnaVarijable

Prije Jave 9 mogli smo upotrebljavati samo svježe varijable unutar a pokušajte s resursima blok:

probajte (Scanner scanner = novi Scanner (nova datoteka ("testRead.txt")); PrintWriter Writer = novi PrintWriter (nova datoteka ("testWrite.txt"))) {// izostavljeno}

Kao što je gore prikazano, ovo je bilo posebno opširno pri deklariranju više izvora. Od Jave 9 i kao dijela JEP 213, sada možemo koristiti konačni ili čak efektivno konačne varijable unutar a pokušajte s resursima blok:

završni skener skenera = novi skener (nova datoteka ("testRead.txt")); PrintWriter Writer = novi PrintWriter (nova datoteka ("testWrite.txt")) pokušaj (skener; pisač) {// izostavljeno}

Pojednostavljeno, varijabla je zapravo konačna ako se ne promijeni nakon prvog dodjeljivanja, iako nije izričito označena kao konačni.

Kao što je gore prikazano, skener deklarirana je varijabla konačni eksplicitno, tako da ga možemo koristiti s pokušajte s resursima blok. iako pisac varijabla nije eksplicitno konačni, ne mijenja se nakon prvog zadatka. Stoga nam je dopušteno koristiti pisac varijabla, također.

9. Zaključak

U ovom smo članku razgovarali o tome kako koristiti opciju try-with-resources i kako zamijeniti probati, ulov, i konačno s try-with-resources, izgradnjom prilagođenih resursa s AutoCloseable i redoslijed zatvaranja resursa.

Kompletna izvorni kod primjer je dostupan u ovom GitHub projektu.