Java, выполняя метод, когда заканчивается область объекта - PullRequest
14 голосов
/ 22 января 2010

У меня есть объект с определенным состоянием. Объект передается вокруг, и его состояние временно изменяется. Что-то вроде:

public void doSomething(MyObject obj) {
    obj.saveState();
    obj.changeState(...);
    obj.use();
    obj.loadState();
}

В C ++ можно использовать область объекта для запуска некоторого кода при построении и удалении, например

NeatManager(MyObject obj) { obj.saveState(); }
~NeatManager() { obj.loadState(); }

и назовите это как

void doSomething(MyObject obj) {
    NeatManager mng(obj);
    obj.changeState();
    obj.use();
}

Это упрощает работу, поскольку сохранение / загрузка связаны с областью действия NeatManager объекта. Можно ли сделать что-то подобное в Java? Есть ли способ вызвать метод, когда объект выходит из области, в которой он был объявлен? Я не говорю ни о finalize(), ни о "уничтожении" (сборке мусора), я интересуюсь областью применения.

Спасибо

Ответы [ 5 ]

13 голосов
/ 22 января 2010

Нет, такого нет. Самый близкий, вероятно, блок try / finally:

try
{
    obj.changeState(...);
    obj.use();
}
finally
{
    obj.loadState();
}

Это гарантирует, что loadState() вызывается, даже когда выдается исключение или есть раннее return.

5 голосов
/ 22 января 2010

Нет, ничего подобного. Самое близкое, что у вас есть, это попробовать / наконец.

В C # есть оператор using, который в конце выполняет метод Dispose:

using (Stream x = ...)
{
} // x.Dispose() is called here, in a finally block

Есть вероятность, что Java 7 получит что-то вроде этого, но я не думаю, что что-то еще было сделано в камне.

2 голосов
/ 09 июня 2015

Java 7 имеет try-with-resources , и вы можете расширить класс AutoCloseable, чтобы использовать его.

Для Java 6 вы можете увидеть соответствующий вопрос: Каков наилучший способ эмуляции try-with-resources в Java 6?

2 голосов
/ 22 января 2010

Как дополнительное примечание, не поддавайтесь искушению использовать метод Object.finalize (), который запускается, когда объект находится в режиме GC, так как вы не можете контролировать, когда объект собирается.

0 голосов
/ 22 января 2010

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

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

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

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

...