2010-01-22 2 views
11

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

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

В C++ это можно использовать масштаб объекта, чтобы запустить код при построении и distructing, как

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

и назвать его как

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

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

Thanks

ответ

12

Нет, нет такой вещи. Ближайший, вероятно, попытка/наконец блок:

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

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

5

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

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

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

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

+0

Спасибо, интересно услышать об этом в Java7. – AkiRoss

-1

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

Medium Ответ: Лучше всего в этой ситуации использовать try ... finally блок.

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

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

+8

Фактически, C++ поддерживает то, о чем спрашивал OP. – 2010-01-22 14:23:28

+1

Я не понимаю, почему вы говорите, что в длинном ответе.Я думал, что все объекты, которые были разрушены после выполнения функции, так как стек освобождается от всех выделенных объектов. Кроме того, я уверен, что это хорошая практика, поскольку я читал об этом в GOTW, но я не уверен, и я проверю. Редактировать: не уверен, что это был GotW, Исключительный C++ или более исключительный C++: \ – AkiRoss

+0

Истинные, деструкторы C++ будут вызываться в объектах, распределенных по стеклу, когда стек, который ссылается на них, освобождается. Тем не менее, на кучи выделенных объектов (т. Е. Подавляющее большинство объектов на большинстве программ) деструктор будет вызываться только при явном уничтожении с использованием ключевого слова 'delete'. – jwoolard

2

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

+0

Да, спасибо. Я немного прочитал о завершении(), но я видел, что это не так. Благодарю. – AkiRoss

Смежные вопросы