Java - Prøv med ressurser

1. Oversikt

Støtte for prøve-ressurser - introdusert i Java 7 - lar oss erklære ressurser som skal brukes i en prøve blokker med forsikring om at ressursene blir stengt når den er utført.

De oppgitte ressursene må implementere Kan lukkes automatisk grensesnitt.

2. Bruke prøv-med-ressurser

Enkelt sagt, for å bli automatisk lukket, må en ressurs både deklareres og initialiseres inne i prøve, som vist under:

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

3. Skifte ut prøvefangst-endelig Med prøv-med-ressurser

Den enkle og åpenbare måten å bruke det nye på prøv-med-ressurser funksjonalitet er å erstatte det tradisjonelle og ordrike prøv-fang-endelig blokkere.

La oss sammenligne følgende kodeeksempler - først er det typisk prøv-fang-endelig blokk, deretter den nye tilnærmingen, ved hjelp av en tilsvarende prøve-med-ressurs-blokk:

Skannerskanner = null; prøv {scanner = new Scanner (new File ("test.txt")); mens (scanner.hasNext ()) {System.out.println (scanner.nextLine ()); }} fange (FileNotFoundException e) {e.printStackTrace (); } til slutt {if (scanner! = null) {scanner.close (); }}

Og her er den superkorte løsningen ved hjelp av prøv-med-ressurser:

prøv (Scanner scanner = new Scanner (new File ("test.txt"))) {while (scanner.hasNext ()) {System.out.println (scanner.nextLine ()); }} fange (FileNotFoundException fnfe) {fnfe.printStackTrace (); }

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

4. prøv-med-ressurser Med flere ressurser

Flere ressurser kan deklareres helt fint i a prøv-med-ressurser blokker ved å skille dem med semikolon:

prøv (Scanner scanner = new Scanner (new File ("testRead.txt")); PrintWriter writer = new PrintWriter (new File ("testWrite.txt"))) {while (scanner.hasNext ()) {writer.print ( scanner.nextLine ()); }}

5. En tilpasset ressurs med Kan lukkes automatisk

Å konstruere en egendefinert ressurs som vil bli håndtert riktig av en prøv-med-ressurser blokk, bør klassen implementere Lukkbar eller Kan lukkes automatisk grensesnitt, og overstyre Lukk metode:

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

6. Avslutningsordre for ressurser

Ressurser som ble definert / ervervet først vil bli stengt sist; la oss se på et eksempel på denne oppførselen:

Ressurs 1:

offentlig klasse AutoCloseableResourcesFirst implementerer AutoCloseable {public AutoCloseableResourcesFirst () {System.out.println ("Constructor -> AutoCloseableResources_First"); } offentlig tomrom doSomething () {System.out.println ("Noe -> AutoCloseableResources_First"); } @ Override public void close () kaster Unntak {System.out.println ("Closed AutoCloseableResources_First"); }} 

Ressurs 2:

offentlig klasse AutoCloseableResourcesSecond implementerer AutoCloseable {public AutoCloseableResourcesSecond () {System.out.println ("Constructor -> AutoCloseableResources_Second"); } offentlig tomrom doSomething () {System.out.println ("Noe -> AutoCloseableResources_Second"); } @ Override public void close () kaster Unntak {System.out.println ("Closed AutoCloseableResources_Second"); }}

Kode:

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

Produksjon:

Konstruktør -> AutoCloseableResources_First

Konstruktør -> AutoCloseableResources_Second

Noe -> AutoCloseableResources_First

Noe -> AutoCloseableResources_Second

Stengt AutoCloseableResources_Second

Stengt AutoCloseableResources_First

7. å fange & endelig

EN prøv-med-ressurser blokkere kan fortsatt ha å fange og endelig blokker - som vil fungere på samme måte som med en tradisjonell prøve blokkere.

8. Java 9: ​​Effektivt endeligVariabler

Før Java 9 kunne vi bare bruke ferske variabler inne i prøv-med-ressurser blokkere:

prøv (Scanner scanner = new Scanner (new File ("testRead.txt")); PrintWriter writer = new PrintWriter (new File ("testWrite.txt"))) {// utelatt}

Som vist ovenfor var dette spesielt ordentlig når deklarerte flere ressurser. Fra og med Java 9 og som en del av JEP 213, vi kan nå bruke endelig eller til og med effektivt endelige variabler inne i prøv-med-ressurser blokkere:

endelig skannerskanner = ny skanner (ny fil ("testRead.txt")); PrintWriter-skribent = ny PrintWriter (ny fil ("testWrite.txt")) prøv (skanner; skribent) {// utelatt}

Enkelt sagt, en variabel er faktisk endelig hvis den ikke endres etter første oppgave, selv om den ikke eksplisitt er merket som endelig.

Som vist ovenfor, skanneren variabel er erklært endelig eksplisitt, slik at vi kan bruke den med prøv-med-ressurser blokkere. Selv om forfatter variabel er ikke eksplisitt endelig, det endres ikke etter første oppgave. Derfor har vi lov til å bruke forfatter variabel også.

9. Konklusjon

I denne artikkelen har vi diskutert hvordan du bruker prøv-med-ressurser, hvordan du bytter ut prøve, å fange, og endelig med prøv-med-ressurser, bygg tilpassede ressurser med Kan lukkes automatisk og rekkefølge ressursene stenges i.

Det komplette kildekode for eksemplet er tilgjengelig i dette GitHub-prosjektet.


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