27 Stimmen

Hat Java ein Äquivalent zu den C# "using" Klausel

Ich habe in einigen C#-Fragen einen Hinweis auf eine "using"-Klausel gesehen. Hat Java das Äquivalent?

1 Stimmen

Mit Java 7 hat sich die Antwort von nein auf ja geändert

30voto

Aaron Maenpaa Punkte 112919

Ja. Mit Java 1.7 wurde die Versuch-mit-Ressourcen Konstrukt, das es Ihnen ermöglicht, zu schreiben:

try(InputStream is1 = new FileInputStream("/tmp/foo");
    InputStream is2 =  new FileInputStream("/tmp/bar")) {
         /* do stuff with is1 and is2 */
}

... genau wie ein using Erklärung.

Vor Java 1.7 waren die Java-Programmierer leider gezwungen, try{ ... } finally { ... }. In Java 1.6:

InputStream is1 = new FileInputStream("/tmp/foo");
try{

    InputStream is2 =  new FileInputStream("/tmp/bar");
    try{
         /* do stuff with is1 and is 2 */

    } finally {
        is2.close();
    }
} finally {
    is1.close();
}

0 Stimmen

Ist es möglich, diese Antwort mit einem Beispiel für C# mit seinem using-Block und für Java mit einem try-finally zu aktualisieren? Vorzugsweise ein Beispiel, das 2 separate Ressourcen verwendet, damit wir dokumentieren können, wie man sicherstellt, dass alles richtig geschlossen wird.

2 Stimmen

Für mich als Java-Anwender ist der obige Vergleich einfach nur schmerzhaft.

0 Stimmen

Auch wenn es technisch korrekt ist, ist dieses Versuch/Ende-Muster nicht das beste. Verwendung: X x = new X(); try{ /*work*/ } finally { x.dispose(); }

11voto

Lodewijk Bogaards Punkte 19188

Ja, seit Java 7 können Sie neu schreiben:

InputStream is1 = new FileInputStream("/tmp/foo");
try{

    InputStream is2 =  new FileInputStream("/tmp/bar");
    try{
         /* do stuff with is1 and is2 */

    } finally {
        is2.close();
    }
} finally {
    is1.close();
}

Als

try(InputStream is1 = new FileInputStream("/tmp/foo");
    InputStream is2 =  new FileInputStream("/tmp/bar")) {
         /* do stuff with is1 and is2 */
}

Die als Parameter an die try-Anweisung übergebenen Objekte sollten die java.lang.AutoCloseable Werfen Sie einen Blick auf die offizielle Dokumente .

Für ältere Versionen von Java prüfen Sie diese Antwort y diese Antwort .

5voto

Tom Hawtin - tackline Punkte 142461

Das nächstliegende Äquivalent innerhalb der Sprache ist die Verwendung von try-finally.

using (InputStream in as FileInputStream("myfile")) {
    ... use in ...
}

wird

final InputStream in = FileInputStream("myfile");
try {
    ... use in ...
} finally {
    in.close();
}

Die allgemeine Form ist immer zu beachten:

acquire;
try {
    use;
} finally {
    release;
}

Befindet sich die Erfassung innerhalb des Try-Blocks, werden Sie freigegeben, wenn die Erfassung fehlschlägt. In manchen Fällen kann man sich mit unnötigem Code behelfen (typischerweise mit dem Testen auf null im obigen Beispiel), aber im Fall von, sagen wir, ReentrantLock werden schlechte Dinge passieren.

Wenn Sie oft dasselbe tun, können Sie das Idiom "execute around" verwenden. Leider ist die Java-Syntax sehr langatmig, so dass es eine Menge Bolier-Platten gibt.

fileInput("myfile", new FileInput<Void>() {
   public Void read(InputStream in) throws IOException {
       ... use in ...
       return null;
   }
});

wobei

public static <T> T fileInput(FileInput<T> handler) throws IOException {
    final InputStream in = FileInputStream("myfile");
    try {
        handler.read(in);
    } finally {
        in.close();
    }
}

Kompliziertere Beispiele sind z. B. die Ausnahmen.

3voto

Tim Punkte 5184

Es hat lange gedauert, aber mit Java 7 ist die Versuch-mit-Ressourcen-Anweisung wurde hinzugefügt, zusammen mit dem AutoCloseable Schnittstelle.

2voto

Bob King Punkte 24518

Nicht, dass ich wüsste. Sie können mit einem try...finally-Block etwas simulieren, aber es ist trotzdem nicht ganz dasselbe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X