Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,当对象';s范围结束_Java_Object_Scope_Destructor - Fatal编程技术网

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中听到这个消息很有趣。