0

我想从对象本身内部杀死/删除一个对象。

我需要的是,对该对象的引用为空,但我不想将句柄传递给容器。这是一个小代码示例:

class Obj {
     void run(){
         if(true)
             kill(); 
     }
}
class A{
    Obj o;
    void main(){
        o.run();
    }
}

跑步后o.run()我想o == null。这可能吗?

4

3 回答 3

1

您不能根据需要从对象本身中对对象的引用为空。从您实际拥有要在范围内无效的引用的角度来看,您可以这样做。

完成后为空引用run()

根据反馈编辑...

class Obj {
    private boolean killMe = false;
    void run(){
        if(someConditionHere) {
            killMe = true;
        }
    }
    public boolean isKillable() { return killMe; }
}

class A{
    Obj o;
    void main(){
        o.run();
        if(o.isKillable()) {
            o = null;
        }
    }
}
于 2013-04-01T17:47:53.457 回答
0

您将无法从其自己的成员方法中取消对象引用,因为对象无法更改其他对象拥有的引用。但是您可以将其所有成员字段设置为 null:未来的调用者每次尝试访问该对象时肯定会收到 NullPointerException。如果你想一想,这甚至比自杀要好:这个物体将保持足够的活力,足以在他周围传播死亡。
如果你幸运的话,你甚至可以让整个应用程序自杀!

如果一个对象可以将其他对象已经对其进行的所有引用设置为空,那么对象世界将是​​一团糟,因为在 OOP 中,一个对象“拥有”它的属性(无论如何都是私有的)并且能够从外部更改它们source 将完全打破封装概念。

现在我很确定它有时可能会很方便(否则你不会问这个问题),但如果你在 java 中编程,你将不会被允许“开箱即用”。
唯一的方法是让你的对象和持有对它的引用的对象就一个共同的策略达成一致。
就像他们在尝试做任何其他事情之前应该调用的 isDead 方法一样。
您还可以实现一个 PsychologicalSupport 对象,它将外部对象的访问代理到您的抑郁对象。当你的对象想死时,他只需要通知它的支持对象,PS 对象将停止代理消息,你的对象将被垃圾回收。

于 2013-04-17T23:20:43.417 回答
0

我会这样做:

class Obj {
    Obj run(){
        if(someConditionHere) {
            return null;
        }

        return this;
    }
}

class A {
    Obj o;
    void main(){
        o = o.run();
    }
}

所以不需要在A中检查o的内部状态。而且封装性更强。

于 2013-04-17T23:39:32.757 回答