Java, выполняющий метод, когда заканчивается область объекта
У меня есть объект с определенным состоянием. Объект передается, и его состояние временно изменено. Что-то вроде:
public void doSomething(MyObject obj) {
obj.saveState();
obj.changeState(...);
obj.use();
obj.loadState();
}
В С++ можно использовать область действия объекта для запуска некоторого кода при построении и расстройстве, например
NeatManager(MyObject obj) { obj.saveState(); }
~NeatManager() { obj.loadState(); }
и назовите его как
void doSomething(MyObject obj) {
NeatManager mng(obj);
obj.changeState();
obj.use();
}
Это упрощает работу, потому что сохранение/загрузка привязана к области NeatManager
. Можно ли сделать что-то подобное на Java? Есть ли способ вызвать метод, когда объект выходит за пределы области, в которой он был объявлен? Я не говорю о finalize()
и "уничтожении" (сборке мусора), меня интересует область.
Спасибо
Ответы
Ответ 1
Нет, нет такой вещи. Самый близкий, вероятно, блок try/finally:
try
{
obj.changeState(...);
obj.use();
}
finally
{
obj.loadState();
}
Это гарантирует, что вызов loadState()
вызывается даже тогда, когда генерируется Исключение или существует ранний return
.
Ответ 2
Нет, ничего подобного. Самое близкое, что у вас есть, это попробовать/наконец.
В С# есть оператор using
, который в конце выполняет метод Dispose
:
using (Stream x = ...)
{
} // x.Dispose() is called here, in a finally block
Есть вероятность, что Java 7 получит что-то вроде этого, но я не думаю, что все еще было каменным.
Ответ 3
В качестве дополнительной заметки не следует искушать использование метода Object.finalize(), который выполняется, когда объект GC'd, так как вы не имеете контроля над тем, когда объект собран.
Ответ 4
Java 7 имеет try-with-resources, и вы можете расширить AutoCloseable
, чтобы использовать его.
Для Java 6 вы можете увидеть связанный с этим вопрос: Каков наилучший способ эмуляции try-in-resources в Java 6?
Ответ 5
Короткий ответ: Нет.
Средний ответ: лучшей практикой в этой ситуации является использование блока try ... finally
.
Более длинный ответ: С++ на самом деле не дает вам этого: деструкторы С++ запускаются при де-распределении. Если вы не освободите объект и все ссылки на него выпадут из области видимости, деструктор не будет вызываться.
В стороне, если сборка мусора в Java была подсчетом ссылок, тогда финализаторы будут реализовывать именно это поведение.