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øve–fangst-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.