Подтвердить что ты не робот

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() и "уничтожении" (сборке мусора), меня интересует область.

Спасибо

4b9b3361

Ответ 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, так как вы не имеете контроля над тем, когда объект собран.

Ответ 5

Короткий ответ: Нет.

Средний ответ: лучшей практикой в ​​этой ситуации является использование блока try ... finally.

Более длинный ответ: С++ на самом деле не дает вам этого: деструкторы С++ запускаются при де-распределении. Если вы не освободите объект и все ссылки на него выпадут из области видимости, деструктор не будет вызываться.

В стороне, если сборка мусора в Java была подсчетом ссылок, тогда финализаторы будут реализовывать именно это поведение.