2

例如,此代码有效吗?

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

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

4

5 回答 5

7

不,此代码无效。

此外,如果它是有效的,我看不出它会有什么有意义的语义。

请提出上述方法的替代方案。

只要有对它的引用,该对象就存在。要使对象有资格进行垃圾回收,您只需要确保没有指向它的引用(在您的情况下,这应该在y达到零时立即发生)。

于 2012-05-16T10:53:04.090 回答
5

不,原因是您没有使对象为空。当你说obj = null;你只是把null以前持有对对象的引用的变量。可能有很多其他对同一对象的引用。

我认为您想要做的是使对象无效并使其被垃圾收集,但在类内部做出此决定。如果这是问题,我建议您查看弱引用。

其他可能的解决方案是在 java 中实现一种“智能引用”。你可以创建你的类SmartReference来保存对对象的真实引用。该对象应该持有对这个智能引用的回调并调用它的方法invalidate(),就像你的语法错误表达式一样this = null。您必须注意不要直接引用此类对象,而只能通过智能引用。

唯一的问题是“你为什么要这样做?”。确实,这会导致代码更加复杂和不稳定。想象一下:对象决定使自己无效,因此“智能引用”所持有的引用变为null. 现在,这个智能引用的所有持有者在尝试使用该对象时都将获得 NPE!这正是java中不存在这种机制并且应用程序程序员无法直接管理内存的原因。

底线:删除所有对象引用并让 GC 完成其艰巨的工作。相信它。它知道清理垃圾。

于 2012-05-16T11:00:52.617 回答
1

我认为这是一个很好的问题。我有很多情况,我希望对象在构造之后/期间验证自己,如果它找到理由,只返回一个空值或返回堆栈并跳过创建该对象。

主要是在您从其他值列表创建对象列表的情况下。如果一个值是垃圾并且您希望您的对象能够识别它。

而不是必须在类本身之外编写一个函数来验证创建,让对象来做这件事会更整洁。

很遗憾java不允许这样的事情假设程序员可能会把它搞砸。如果你的代码很好,那将是一个不错的功能。

于 2015-02-24T00:03:12.980 回答
0

我认为您需要重新考虑为什么要这样做,因为您所建议的内容在 Java 中甚至不作为一个概念存在。

this变量总是指对象本身。你不能“取消”一个对象,只能是一个引用(毕竟,你所做的是分配一个引用来指向null而不是它的前一个对象)。这样做是没有意义的this,因为它始终是指向范围内当前对象的指针。

您是否试图强制销毁对象/收集垃圾?如果是这样,当你的代码的其他部分仍然有对它的引用时,你不能这样做(如果它们没有引用,无论如何它都会被垃圾收集)。

无论如何,您希望/认为这会做什么?

于 2012-05-16T10:54:08.577 回答
0

你的代码必须得到编译时错误..因为..

The left-hand side of an assignment must be a variable

this不是变量它是关键字..

this=null;
于 2012-05-16T11:01:43.070 回答