有没有办法使用Java从对象内部销毁对象?

时间:2013-04-01 17:38:50

标签: java

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

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

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

运行o.run()之后我想o == null。这可能吗?

3 个答案:

答案 0 :(得分: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;
        }
    }
}

答案 1 :(得分:0)

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

如果对象可以将其他对象已经对其进行的所有引用设置为null,则对象世界将是​​一个非常混乱,因为在OOP中对象"拥有"它的属性(无论如何私有)并且能够从外部源更改它们将彻底打破封装概念。

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

答案 2 :(得分:0)

我会这样做:

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

        return this;
    }
}

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

所以没有必要在A中检查o的内部状态。它更加封装。