Java,当对象';s范围结束
我有一个特定状态的对象。对象被传递,其状态被临时更改。比如:Java,当对象';s范围结束,java,object,scope,destructor,Java,Object,Scope,Destructor,我有一个特定状态的对象。对象被传递,其状态被临时更改。比如: public void doSomething(MyObject obj) { obj.saveState(); obj.changeState(...); obj.use(); obj.loadState(); } 在C++中,在构造和分解时,可以使用对象的范围来运行一些代码,如 NeatManager(MyObject obj) { obj.saveState(); } ~NeatManager(
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()
或“销毁”(垃圾收集),我感兴趣的是范围
谢谢不,没有这样的事。最接近的可能是try/finally块:
try
{
obj.changeState(...);
obj.use();
}
finally
{
obj.loadState();
}
这确保了即使在抛出异常或出现早期的
返回时也会调用loadState()
,不,没有类似的情况。你所能做的最接近的事情就是尝试/最终
在C#中有using
语句,它在末尾执行Dispose
方法:
using (Stream x = ...)
{
} // x.Dispose() is called here, in a finally block
Java 7有可能获得类似的东西,但我认为还没有任何东西是一成不变的。简短回答:没有
中等回答:这种情况下的最佳做法是使用尝试。。。最后
block
<> >更长的答案:C++也不给你这个:C++析构函数在DE分配上运行。如果未能取消分配对象,并且对该对象的所有引用都超出范围,则不会调用析构函数
另一方面,如果Java中的垃圾收集是引用计数,那么终结器将完全实现这种行为。作为补充说明,不要尝试使用Object.finalize()方法,该方法在对象被GC调用时运行,因为您无法控制收集对象的时间。Java7有,您可以扩展类来利用它
<> > <强> java 6 <强>你可能想看到相关的问题:实际上C++确实支持OP所问的内容。我不明白为什么你在长的答案中这么说。我认为在函数完成后,所有对象都会被破坏,因为堆栈将从所有分配的对象中释放。另外,我很确定这是一个很好的实践,因为我在GOTW上读到过,但我不确定,我会检查一下。编辑:不确定是GotW,例外C++还是更特殊的C++:\true,当堆栈被分配对象被引用时,将调用C++析构函数。但是,在堆分配对象(即大多数程序上的绝大多数对象)中,析构函数将只使用“代码>删除//>代码>关键字调用显式销毁。在C++中,此类局部对象往往是堆栈分配的。除非您想自己管理对象的生命周期,否则不能使用new
关键字将某些内容放入堆中。堆栈分配的对象在对象超出范围时被销毁。是的,谢谢。我读了一些关于finalize()的文章,但我发现事实并非如此。谢谢。谢谢,在Java7中听到这个消息很有趣。