Ближайшим эквивалентом в языке является использование try-finally.
using (InputStream in as FileInputStream("myfile")) {
... use in ...
}
становится
final InputStream in = FileInputStream("myfile");
try {
... use in ...
} finally {
in.close();
}
Обратите внимание, что общая форма всегда:
acquire;
try {
use;
} finally {
release;
}
Если приобретение находится в блоке try, вы разблокируете его в случае сбоя при получении. В некоторых случаях вы можете взломать ненужный код (обычно тестирование на ноль в приведенном выше примере), но в случае, скажем, ReentrantLock произойдут плохие вещи.
Если вы часто делаете одно и то же, вы можете использовать идиому «выполнить вокруг». К сожалению, синтаксис Java является многословным, поэтому есть много более смелых табличек.
fileInput("myfile", new FileInput<Void>() {
public Void read(InputStream in) throws IOException {
... use in ...
return null;
}
});
, где
public static <T> T fileInput(FileInput<T> handler) throws IOException {
final InputStream in = FileInputStream("myfile");
try {
handler.read(in);
} finally {
in.close();
}
}
Более сложный пример, например, исключения для переноса.