我有一个具有某种状态的物体。对象被传递,它的状态暂时改变。类似的东西:
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()
或“破坏”(垃圾收集),我对范围感兴趣。
由于
答案 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中的垃圾收集是引用计数,那么终结器将实现这种行为。