Java:创建新实例

时间:2012-10-30 08:03:18

标签: java oop object garbage-collection

说我想创建一个新的实例foo。

我会这样做:

SomeClass foo = new SomeClass();

现在让我们说对象已经到了终点(例如,像游戏中的碰撞子弹),应该处理并重新初始化。要重置对象,我可以这样做:

foo = new SomeClass();

或者

foo.reset();

注意:reset()方法只会重置该实例中的所有变量。

哪种方式更好(试图避免使用GC)? 第一个选项会创建一个新指针吗?

2 个答案:

答案 0 :(得分:2)

第一个选项创建一个新对象,并将旧对象保留为垃圾(除非有其他实时引用)。

减少GC的一个策略是维护对象池。这只是一组没有当前使用且可供重用的对象。完成对象后,调用将其返回池的方法。当您需要一个新对象时,请在创建新对象之前调用一个检查池的方法;如果池不为空,它将从池中删除一个对象并重用它而不是创建一个新对象。

public class SomeClass {
    private static final int MAX_POOL_SIZE = . . .;
    private static final ArrayList<SomeClass> pool = new ArrayList<SomeClass>();

    public static SomeClass getInstance() {
        int poolSize = pool.size();
        if (poolSize > 0) {
            return pool.remove(poolSize-1);
        }
        return new SomeClass();
    }

    public void recycle() {
        // reset any fields
        if (pool.size() < MAX_POOL_SIZE) {
            pool.add(this);
        }
    }
    . . .
}

当您需要新的SomeClass时,请致电SomeClass.getInstance()。完成实例后,请调用recycle()方法。

答案 1 :(得分:0)

如果您想避免GC,第二个选项更好。

实际上,即使您选择了第一个选项,JVM也不会立即执行GC。当堆满时(或者对于刚刚创建的对象不够),它将是GC。第一个创建一个新实例,并且没有对旧对象的强引用。因此,当JVM的堆已满时,它将执行GC,并且旧对象将进行GC。

此外,还有一些关于GC的内容,参考是您使用的参考类型。有四种类型的引用,名为“强,软,弱和幻影”。即使您使用第二个选项,对象“foo”也可能是GCed,除非对象“foo”的引用是强烈的引用。请参阅JDK文档以获取有关四种引用类型的更多信息,例如Reference Phantom SoftReference WeakReference