调用者对象方法来销毁另一个对象

时间:2012-08-27 23:29:08

标签: java

如果我创建lion类型的对象和prey类型的对象,我想这样做:

lion.eat(prey)

期间

lion.energy=energy+10,as an example.
prey=null

但我也想完全从逻辑生态系统中摧毁猎物。

我了解垃圾收集器以及所有这些,而且人们对垃圾收集器所说的所有内容都会在没有任何指向它的情况下立即销毁该对象。

但我正在虚拟生态系统中实施一个拥有数百万只狮子和鹿实例的遗传算法。现在我该如何消灭死去的动物?

请不要讨厌的笑话,我厌倦了总是绊倒垃圾收集者和对象谋杀的相同答案,我想要一个解决方案的描述,从狮子方法逻辑上取消引用猎物对象。

public class prey
{
  int energy=10;
}

public class lion
{
  int energy=0;

  public void eat(prey aDeer)
  {
    this.energy=aDeer.energy+this.energy; ///acumulate energy values from prey
    aDeer=null;//destroys the object from ecosystem, which seems impossible to do in java
  }
}

3 个答案:

答案 0 :(得分:1)

你已经拥有数百万只猎物,你可能将它们存放在一个集合中;例如,ArrayList。从ArrayList删除项目非常简单;调用其.remove()函数。

答案 1 :(得分:0)

正如已经提到的,你无法在Java中执行显式内存管理;你所能做的就是确保没有引用使死对象保持活着(双关语!)并让垃圾收集器完成它的工作。请注意,这可能比显式内存管理更有效,特别是在大量小对象被破坏的情况下。

如果你的人口总体规模变化比其成员出生和死亡的速度慢得多,你可能确实如@veer所建议的那样,考虑保留一群动物,而不是创建新的物品从你的他们出生时会聚集在一起,并在他们死后归还他们。

答案 2 :(得分:0)

如果对象创建和破坏是瓶颈(通过分析找出,而不是猜测),你可以将所有动物放入数组(或数组列表以允许增长,如果最大人口未知),在每个动物商店中将其当前索引,当杀死动物时,将它与最后的活动物交换,减少活体动物的反击。用更少的话来说,按照之前的建议制作动物池。 如果只有少数动物被保留到下一代,可以考虑使用2个阵列,然后浏览前一个并处理生成新一代并切换这些阵列。

但是为了使它变得有用,你需要让所有的动物(在给定的阵列中)在结构上相同,所以曾经的鹿可能是下一次兔子。 所以要么只有动物类,要么每个物种一个数组。

PS。不要试图找到手动销毁对象的方法,要么找到避免创建和销毁对象的方法(特别是如果生成大小没有太大变化,那么每个人都会再次需要)或依赖GC。