Java有效地删除对象

时间:2014-04-18 23:57:53

标签: java

我想在java中制作一个小游戏。我创建了一个我称为Game的类和一些子类。我将子类Body用于游戏中的各种对象。我想在Game中使用一个方法来生成对象。此方法应添加对列表的引用,以便稍后可以计算与其他实体的交互。

Game类看起来像这样:

import java.util.*;

class Game {

    public List<Body> bodies = new ArrayList<Body>();

    public void spawn( Body body ) {
        bodies.add( body );
    }
}

是的,我认为这很有效。现在我希望能够去除尸体。我试过这个:

import java.util.*;

class Game {

    public List<Body> bodies = new ArrayList<Body>();

    public void spawn( Body body ) {
        bodies.add( body );
    }

    public void despawn( Body body ) {
        body = null;
    }
}

它没有按预期工作。我想它只是删除了对该对象的引用,如果这是正确的我不知道如何删除对该对象的所有引用。我想我可以迭代数组,但这似乎很愚蠢,因为我有一个对实际对象的引用。我不应该摧毁它吗?更优雅的替代品?

2 个答案:

答案 0 :(得分:2)

public void despawn( Body body ) {
    body = null;
}

在此,您只需将body的值设置为null,即可传递给public void despawn( Body body ) { if(body != null && !bodies.isEmpty()){ bodies.remove(body); } }

你能做的就是打电话:

body

假设您还处理了传递给方法的对象,那么将删除内存中出现的所有{{1}}。

答案 1 :(得分:1)

body = null;唯一要做的就是设置despawnbody的本地null引用。它不会影响实际对象。

要从bodies List中删除它,请拨打bodies上的remove method,并将body作为参数传递。确保您的Body课程覆盖equals中的Object方法,以便列表可以正确找到要删除的匹配项。

一旦bodies不再有引用,并且despawn方法完成,并且对“despawn”对象的任何其他引用超出范围或重新分配,则删除的对象将符合条件用于垃圾收集。垃圾收集器会在没有任何引用之后将其销毁。