Java - Prøv med ressourcer

1. Oversigt

Støtte til prøve-ressourcer - introduceret i Java 7 - giver os mulighed for at erklære ressourcer, der skal bruges i en prøve blokere med forsikring om, at ressourcerne lukkes, når de er udført efter denne blok.

De angivne ressourcer skal implementere Kan lukkes automatisk interface.

2. Brug prøv med ressourcer

For at være automatisk lukket skal en ressource både erklæres og initialiseres inde i prøvesom vist nedenfor:

prøv (PrintWriter-skribent = ny PrintWriter (ny fil ("test.txt"))) {writer.println ("Hello World"); } 

3. Udskiftning prøvefangst-endelig Med prøv med ressourcer

Den enkle og oplagte måde at bruge det nye på prøv med ressourcer funktionalitet er at erstatte den traditionelle og den detaljerede prøv-fang-endelig blok.

Lad os sammenligne følgende kodeeksempler - først er det typisk prøv-fang-endelig blok, så den nye tilgang ved hjælp af en tilsvarende prøve-med-ressource-blok:

Scannerscanner = null; prøv {scanner = ny scanner (ny fil ("test.txt")); mens (scanner.hasNext ()) {System.out.println (scanner.nextLine ()); }} fange (FileNotFoundException e) {e.printStackTrace (); } endelig {if (scanner! = null) {scanner.close (); }}

Og her er den super kortfattede løsning ved hjælp af prøv-med-ressourcer:

prøv (Scannerscanner = ny scanner (ny fil ("test.txt"))) {mens (scanner.hasNext ()) {System.out.println (scanner.nextLine ()); }} fange (FileNotFoundException fnfe) {fnfe.printStackTrace (); }

Her kan du se nærmere på Scanner klasse.

4. prøv med ressourcer Med flere ressourcer

Flere ressourcer kan erklæres fint i en prøv med ressourcer blok ved at adskille dem med et semikolon:

prøv (Scannerscanner = ny scanner (ny fil ("testRead.txt")); PrintWriter-forfatter = ny PrintWriter (ny fil ("testWrite.txt"))) {mens (scanner.hasNext ()) {writer.print ( scanner.nextLine ()); }}

5. En brugerdefineret ressource med Kan lukkes automatisk

At konstruere en brugerdefineret ressource, der håndteres korrekt af en prøv med ressourcer blok, skal klassen implementere Kan lukkes eller Kan lukkes automatisk grænseflader og tilsidesætter tæt metode:

offentlig klasse MyResource implementerer AutoCloseable {@ Override public void close () kaster Undtagelse {System.out.println ("Closed MyResource"); }}

6. Resource Closing Order

Ressourcer, der blev defineret / erhvervet først, lukkes sidst; lad os se på et eksempel på denne adfærd:

Ressource 1:

offentlig klasse AutoCloseableResourcesFirst implementerer AutoCloseable {public AutoCloseableResourcesFirst () {System.out.println ("Constructor -> AutoCloseableResources_First"); } offentlig ugyldighed doSomething () {System.out.println ("Noget -> AutoCloseableResources_First"); } @ Override offentlig tomrum tæt () kaster undtagelse {System.out.println ("Lukket AutoCloseableResources_First"); }} 

Ressource 2:

offentlig klasse AutoCloseableResourcesSecond implementerer AutoCloseable {public AutoCloseableResourcesSecond () {System.out.println ("Constructor -> AutoCloseableResources_Second"); } offentligt tomrum doSomething () {System.out.println ("Noget -> AutoCloseableResources_Second"); } @ Override offentlig tomrum tæt () kaster undtagelse {System.out.println ("Lukket AutoCloseableResources_Second"); }}

Kode:

privat ugyldig ordreOfClosingResources () kaster undtagelse {try (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst (); AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond ()) {af.doSomething (); as.doSomething (); }} 

Produktion:

Konstruktør -> AutoCloseableResources_First

Konstruktør -> AutoCloseableResources_Second

Noget -> AutoCloseableResources_First

Noget -> AutoCloseableResources_Second

Lukket AutoCloseableResources_Second

Lukket AutoCloseableResources_First

7. fangst & langt om længe

EN prøv med ressourcer blok kan stadig have fangst og langt om længe blokke - som fungerer på samme måde som med en traditionel prøve blok.

8. Java 9: ​​Effektivt endeligVariabler

Før Java 9 kunne vi kun bruge friske variabler inde i en prøv med ressourcer blok:

prøv (Scannerscanner = ny scanner (ny fil ("testRead.txt")); PrintWriter-forfatter = ny PrintWriter (ny fil ("testWrite.txt"))) {// udeladt}

Som vist ovenfor var dette især detaljeret, når man erklærede flere ressourcer. Fra Java 9 og som en del af JEP 213, vi kan nu bruge endelig eller endda effektivt endelige variabler inde i en prøv med ressourcer blok:

endelig scannerscanner = ny scanner (ny fil ("testRead.txt")); PrintWriter-forfatter = ny PrintWriter (ny fil ("testWrite.txt")) prøv (scanner; forfatter) {// udeladt}

Enkelt sagt er en variabel effektivt endelig, hvis den ikke ændres efter den første opgave, selvom den ikke udtrykkeligt er markeret som endelig.

Som vist ovenfor er scanner variabel erklæres endelig eksplicit, så vi kan bruge det med prøv med ressourcer blok. Selvom forfatter variabel er ikke eksplicit endelig, det ændrer sig ikke efter den første opgave. Derfor har vi lov til at bruge forfatter variabel også.

9. Konklusion

I denne artikel har vi diskuteret, hvordan man bruger prøve-med-ressourcer, hvordan man udskifter prøve, fangstog langt om længe med prøv-med-ressourcer, opbygning af brugerdefinerede ressourcer med Kan lukkes automatisk og rækkefølge, i hvilke ressourcer er lukket.

Det komplette kildekode eksemplet er tilgængeligt i dette GitHub-projekt.


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