In java, how can we destruct an instance of a class from a method within the class
我对它的处理类似于删除任何常见对象的情况,即,只需将引用设为空并让垃圾收集器完成它的工作。
但是,对于类内等于空的情况,对对象的唯一引用是"this"。以下类的代码是否有效:
1 2 3 4 5 6 7 8 9 10 11 | class A{ public A(){ //Init } public void method destruct(){ if(someCondition){ this=null; //Is this statement valid? Why / Why not? } } } |
你不会在Java中"破坏"对象。这是个错误的想法。不要这样做。
对象是在Java堆中创建的。只要有一个参照物指向他们,他们就活得很长。垃圾收集者把这些乱七八糟的东西清理干净。
你当然应该尽你所能确保你不会不必要地积累和保留引用(例如,在Swing中的听众)。
但你的建议根本不正确。停下来。
1 this=null; //Is this statement valid? Why / Why not?
它不是有效的Java,因为EDCOX1〔6〕不是LValk;也不是指您可以指派的东西。这是一个编译错误,就像
(jls对赋值做了如下描述:"赋值运算符的第一个操作数的结果必须是一个变量,否则会出现编译时错误。"-jls 15.26.1 jls文本随后列出符合变量的不同内容,而
此外,正如达夫莫莫所言,在爪哇做这件事是完全错误的。让GC来做它的工作。
注意:你的建议不太可能有用。
你能做的就是使用委托。
1 2 3 4 5 6 7 8 9 | class A { private AImpl impl = new AImpl(); public void close() { if (impl != null) impl.close(); impl = null; } } |
由于所有引用都是间接的,因此可以确保只有一个对实际对象的引用,并将其清除。
一些OSGi容器中的代理在卸载组件时执行此操作。由于容器对引用的生命周期几乎没有控制权,因此很难卸载库(实现)。
设置
你的目标被深深地误导了。
实例外部的任何一个人都持有对它的非弱引用。不管你在里面做什么,它都不会被收集。或者没有人这样做,那么不管你在里面做什么,它最终都会被收集起来。在这两种情况下,EDCOX1×1都没有区别,即使是合法的Java代码。不要这样做。如果你关心的是对象的生存期和内存耗尽,那就把你想要摆脱的对象从一边看出来。
执行线程位于析构函数()方法内的原因告诉我,有一个调用方正在对类A的实例进行引用,但是,在Java中,您不能做任何类似"这=null"的事情,即使Java中允许使用它也不会有帮助。不能破坏Java中的对象。
这是一个编译错误。不能将空值赋给"this"。关键字"this"可用于等号的右侧(但左侧不为空除外)。原因:不能将任何内容分配给空值)。
为了破坏,在Java中,你有一个GC可以在幕后为你做这项工作。
请注意,对于用户定义的对象,您仍然可以执行以下操作-
1 | object reference = null; |
但是"this"不能用于equals的左侧。
不,上面的代码无效。类的引用
另外,由于
你可以打电话:
1 |
但是如果你这样做了,你会弄乱JVM运行时。如果将reference设置为空,则该对象仍然存在,它的"just its"引用将不会引用该对象,并且在下次调用gc时,它将销毁该对象(除非其他引用引用引用它)。
对象的生命周期由JVM控制,因此对象不能决定何时不再需要它自己。您可以做的是对这个对象的引用进行一些努力。可以使用引用类型来指出对象的"重要性"。
Java中引用的基本类型可以在这里找到:
更多信息请访问:http://docs.oracle.com/javase/1.3/docs/api/java/lang/ref/package-summary.html
此处讨论参考文献:Java中的软引用和弱引用有什么区别?和理解Java的引用类:软引用、弱引用和幻像引用
在方法中,
不。当没有引用指向某个实例对象时,GC可以删除该实例对象,即它在所有正在运行的线程中都无法导航到该对象。当您在执行一个方法的对象中时,这个方法是从外部调用的,因此有一个对该对象的引用。对象本身不能被销毁,因为对它的引用仍然保留在外部。
考虑另一种内存管理方法。
在Java中,没有明确的EDCOX1(2)特定引用的方法。Java这样做是为了避免挂起引用。如果您
无论如何,您不应该尝试
对于Java垃圾收集器来说,它不应该被引用为其他类。
语句