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.
1 Stimmen
Mit Java 7 hat sich die Antwort von nein auf ja geändert