Представьте, что MyOpenedFile - это что-то, обертывающее файл с открытыми потоками. Теперь предположим, этот код:Есть ли чистый способ предоставить объекты объектов Java с уничтожением?
// method in an Util class
static void safeClose(MyOpenedFile f) {
if (f != null) {
try {
f.close();
} catch(IOException ex) { /* add logging or console output */ }
}
}
Фактический метод вопрос:
void doSomeFileOperation(...) throws IOException, ... {
MyOpenedFile f1 = null;
MyOpenedFile f2 = null;
try {
/* method's "business logic" code beings */
f1 = new MyOpenedFile(...);
//do stuff
f2 = new MyOpenedFile(...);
// do stuff
f1.close(); f1 = null;
// do stuff with f1 closed
f2.close(); f2 = null;
// do stuff with f2 closed
/* method's "business logic" code ends */
} finally {
Util.safeClose(f1); f1 = null;
Util.safeClose(f2); f2 = null;
}
}
Сейчас это довольно неаккуратно и особенно подвержены ошибкам (некоторый код в конце концов блок может быть очень трудно получить вызов в блоке тесты, например). Например, в C++ деструктор позаботится о том, чтобы очистить (либо получить вызов с помощью деструктора указателя области действия, либо напрямую), и код будет намного чище.
Итак, есть лучше/красивее/уборщик способ обернуть выше части бизнес-логики кода, так что любые исключения получить размножают, но оба файла f1
и f2
закрываются (или по крайней мере близко предпринимается на обоих, даже если он не получится)?
Также ответы, указывающие на любые библиотеки с открытым исходным кодом, такие как Apache Commons, обеспечивая приятные обертки.
Кстати, ваш пример кода имеет ошибку в нем, что будет на самом деле привести вас к утечке дескрипторов файлов, так как вы установите f1 = нуль, прежде чем закрыть его. – Chii
@Chii Нет, это не так, насколько я вижу. Там 'close' или' safeClose' * перед * все 'null' назначения. – hyde
Почему вы дважды нажимаете 'close' на файл (в конце концов и в конце)? – home