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

2voto

McDowell Punkte 105255

Am nächsten kommt man in Java mit try/finally. Außerdem gibt es in Java keinen impliziten Disposable-Typ.

C#: Scoping der Variablen außerhalb eines using-Blocks

public class X : System.IDisposable {

    public void Dispose() {
        System.Console.WriteLine("dispose");
    }

    private static void Demo() {
        X x = new X();
        using(x) {
            int i = 1;
            i = i/0;
        }
    }

    public static void Main(System.String[] args) {
        try {
            Demo();
        } catch (System.DivideByZeroException) {}
    }

}

Java: Scoping der Variablen außerhalb eines Blocks

public class X {

    public void dispose() {
        System.out.println("dispose");
    }

    private static void demo() {
        X x = new X();
        try {
            int i = 1 / 0;
        } finally {
            x.dispose();
        }        
    }

    public static void main(String[] args) {
        try {
            demo();
        } catch(ArithmeticException e) {}
    }

}

C#: Scoping der Variablen innerhalb eines Blocks

public class X : System.IDisposable {

    public void Dispose() {
        System.Console.WriteLine("dispose");
    }

    private static void Demo() {
        using(X x = new X()) {
            int i = 1;
            i = i/0;
        }
    }

    public static void Main(System.String[] args) {
        try {
            Demo();
        } catch (System.DivideByZeroException) {}
    }

}

Java: Scoping der Variablen innerhalb eines Blocks

public class X {

    public void dispose() {
        System.out.println("dispose");
    }

    private static void demo() {
        {
            X x = new X();
            try {
                int i = 1 / 0;
            } finally {
                x.dispose();
            }
        }
    }

    public static void main(String[] args) {
        try {
            demo();
        } catch(ArithmeticException e) {}
    }

}

1voto

Pablo Fernandez Punkte 98441

Ich denke, Sie können etwas Ähnliches wie den "using"-Block erreichen, indem Sie eine anonyme innere Klasse implementieren. So wie Spring es mit den "Dao Templates" macht.

0voto

Andrei Rînea Punkte 19502

Nun ja, die Verwendung von syntaktischem Zucker war sowieso nur eine Frage der Zeit, also liebe Java-Freunde, macht euch keine Sorgen.

0voto

Lars Westergren Punkte 2045

Wenn wir BGGA-Schließungen in Java bekommen, würde dies auch ähnliche Strukturen in Java ermöglichen. Gafter hat dieses Beispiel zum Beispiel in seinen Folien verwendet:

withLock(lock) { //closure }

0voto

Die tatsächliche Redewendung, die von den meisten Programmierern für das erste Beispiel verwendet wird, lautet wie folgt:

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

    /* do stuff with is1 and is 2 */

} finally {
    if (is1 != null) {
        is1.close();
    }
    if (is2 != null) {
        is2.close();
    }
}

Mit diesem Idiom wird weniger eingerückt, was umso wichtiger ist, wenn Sie mehr als 2 Ressourcen zu bereinigen haben.

Außerdem können Sie der Struktur eine catch-Klausel hinzufügen, die bei Bedarf eine Ausnahme für den neuen FileStream() auslöst. Im ersten Beispiel müssten Sie einen weiteren try/catch-Block einschließen, wenn Sie dies tun wollten.

0 Stimmen

Mit diesem Code kann is2 nicht geschlossen werden, wenn der Aufruf von is1.close() eine Ausnahme auslöst. Der in der Frage angegebene verschachtelte Code ist vorzuziehen.

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