例如,此代码有效吗?。
class abc{
int x,y;
abc(int x,int y){
this.x=x;
this.y=y;
while(true)
update();
}
public void update(){
x--;
y--;
if(y==0)
this=null;
}
}
如果上述内容无效,请解释原因。在某些迭代不再存在之后,我需要一个类。请提出上述方法的替代方案。
答案 0 :(得分:7)
不,此代码无效。
此外,如果它有效,我不会看到它可能有什么有意义的语义。
请建议上述方法的替代方案。
只要有对象的引用,该对象就存在。要使对象符合垃圾收集条件,您只需确保没有指向它的引用(在您的情况下,只要y
达到零,就会发生这种情况。)
答案 1 :(得分:5)
没有。原因是你没有使对象为null。当你说obj = null;
时,你只需将null
放到先前持有对象引用的变量上。可能还有很多其他对同一对象的引用。
我认为你想要做的就是使一些无效的对象变得垃圾,但是在课堂上做出这个决定。如果这是问题,我建议你看看弱引用。
其他可能的解决方案是在java中实现一种“智能引用”。您可以创建将保存对象真实引用的类SmartReference
。该对象应该保持对此智能引用的回调,并调用其方法invalidate()
,这类似于语法错误的表达式this = null
。您必须注意不要直接引用此类对象,而只能通过智能引用。
唯一的问题是“你为什么要这样做?”。实际上,这会导致代码更复杂和不稳定。想象一下:对象决定使自己无效,因此“智能引用”所持有的引用变为null
。现在,这个智能参考的所有持有者在尝试使用该对象时都会获得NPE!这正是java中不存在这种机制的原因,并且应用程序员不能直接管理内存。
底线:删除所有对象引用,让GC完成其艰苦的工作。相信它。它知道要清理垃圾。
答案 2 :(得分:1)
我认为这是一个很好的问题。 我有大量的情况,我希望在构造之后/期间对象进行验证,如果它找到了理由,只返回一个空值或者返回堆栈并跳过创建该对象。
主要是在您从其他值列表中创建对象列表的情况下。如果值是垃圾,并且您希望对象识别此值。
然后必须在类本身之外编写一个函数来验证创建,允许对象执行它将更加简洁。
遗憾的是,程序员可能会搞砸它,因此java不允许这样的事情。如果你编码得好,这将是一个很好的功能。
答案 3 :(得分:0)
我认为您需要重新考虑为什么要这样做,因为您所建议的内容甚至不是作为Java中的概念存在。
this
变量始终引用对象本身。你不能“取消”一个对象,只能一个引用(因为毕竟,你正在做的是分配一个引用指向null
而不是它的前一个对象)。使用this
执行此操作是没有意义的,因为总是指向范围中当前对象的指针。
您是否试图强制将对象销毁/垃圾收集?如果是这样,你不能这样做,而代码的其他部分仍然有引用它(如果它们没有引用,它将被垃圾收集)。
无论如何,你希望/认为这会做什么?
答案 4 :(得分:0)
你的代码必须得到编译时错误.. 因为..
The left-hand side of an assignment must be a variable
this
不是变量关键字..
this=null;