一个类可以从类本身中取消吗?

时间:2012-05-16 10:49:47

标签: java class this

例如,此代码有效吗?。

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;
    }
 }

如果上述内容无效,请解释原因。在某些迭代不再存在之后,我需要一个类。请提出上述方法的替代方案。

5 个答案:

答案 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;