Java,在对象的作用域结束时执行方法

时间:2010-01-22 14:15:42

标签: java object scope destructor

我有一个具有某种状态的物体。对象被传递,它的状态暂时改变。类似的东西:

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 个答案:

答案 0 :(得分:13)

不,没有这样的事情。最接近的可能是try / finally块:

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

这确保即使在抛出异常或早期loadState()时也会调用return

答案 1 :(得分:5)

不,没有那样的。你最接近的是try / finally。

在C#中有using语句,它在最后执行Dispose方法:

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

Java 7有可能获得类似这样的东西,但我认为没有任何东西已经完成了。

答案 2 :(得分:2)

作为补充说明,不要试图使用Object.finalize()方法,该方法在对象是GC时运行,因为您无法控制何时收集对象。

答案 3 :(得分:2)

Java 7 try-with-resources,您可以扩展AutoCloseable类来使用它。

对于 Java 6 ,您可能希望查看相关问题:What is the best way to emulate try-with-resources in Java 6?

答案 4 :(得分:0)

简短回答:不。

中等回答:这种情况下的最佳做法是使用try ... finally阻止。

更长的答案:C ++并没有真正给你这个:C ++析构函数在解除分配时运行。如果您无法释放对象并且对它的所有引用都超出范围,则不会调用析构函数。

顺便说一句,如果Java中的垃圾收集是引用计数,那么终结器将实现这种行为。