2013-04-01 41 views
0

我想从对象本身内部杀死/删除一个对象。有没有办法使用Java从对象内部销毁对象?

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

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

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

+1

_o = null_是自杀的捷径。不是吗?所以使用它。然后垃圾收集博士会来,并将其引导到坟墓场。 – Juvanis

+1

如果我知道了,在java中,你不能使用它的引用来改变一个对象的值,因为对象在java中传值。 – Kareem

+0

从o内部我怎么能使o = null?真正的里面,如果只是例如 – Krever

回答

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

我做这个“真实”,如果混淆。杀死对象取决于某些条件,这是基于一些Obj的私人成员。所以我想把它放在Obj里面。所以它是不可能的... – Krever

+0

编辑,以反映我认为你想要的。让对象在run()期间设置自己的状态,并在run()返回后询问状态。 – Todd

+0

好吧,它的好处。谢谢 – Krever

0

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

对象世界将是​​一个烂摊子,如果一个物体设置其他物体已经向它提出的为空的所有引用,因为在面向对象编程的对象“拥有”它的属性(私人那些反正),并能够让他们从外部来源改变将彻底打破封装概念。

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

0

我这样做:

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

     return this; 
    } 
} 

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

所以没有必要为您在A.Ø的内部状态,并且更封装。