Java:创建新实例

Java:创建新实例,java,oop,object,garbage-collection,Java,Oop,Object,Garbage Collection,假设我想创建一个新的实例foo 我会这样做: SomeClass foo = new SomeClass(); 现在让我们假设该对象已到达其终点(如游戏中的碰撞子弹),应进行处置并重新初始化。要重置对象,我可以执行以下操作: foo = new SomeClass(); 还是这个 foo.reset(); 注意:reset()方法只会重置该实例中的所有变量 (当试图避免GC时)哪种方法更好? 第一个选项会创建一个新指针吗?第一个选项创建一个新对象,并将旧对象作为垃圾收集(除非有其他活动引用

假设我想创建一个新的实例foo

我会这样做:

SomeClass foo = new SomeClass();
现在让我们假设该对象已到达其终点(如游戏中的碰撞子弹),应进行处置并重新初始化。要重置对象,我可以执行以下操作:

foo = new SomeClass();
还是这个

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

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

第一个选项创建一个新对象,并将旧对象作为垃圾收集(除非有其他活动引用)

减少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{
私有静态最终int MAX_POOL_SIZE=。;
私有静态最终ArrayList池=新ArrayList();
公共静态SomeClass getInstance(){
int poolSize=pool.size();
如果(池大小>0){
返回池。移除(池大小-1);
}
返回新的SomeClass();
}
公共空间回收(){
//重置任何字段
if(pool.size()

当您需要新的
SomeClass
时,请调用
SomeClass.getInstance()
。当您处理完一个实例后,调用它的
recycle()
方法。

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

实际上,即使您选择第一个选项,JVM也不会立即执行GC。当堆已满(或不足以容纳刚刚创建的对象)时,它将执行GC。第一个实例创建一个新实例,并且没有对旧对象的强引用。因此,当JVM的堆已满时,它将执行GC,而旧对象将被GCed


此外,还有一些关于GC的内容,引用就是您使用的引用类型。有四种参考语,叫做“强、软、弱和幻影”。即使使用第二个选项,对象“foo”也可能是GCed,除非对对象“foo”的引用是强引用。请参阅JDK文档以了解有关四个参考类型的更多信息,例如

+1。你能让它在实例化时使用泛型吗?还有一个单独的游泳池课程?“我认为把它放在一起不够干净。”弗拉维乌斯-它稍微复杂一点,但它是可以做到的。您需要有一个工厂对象或提供一些其他机制,以便在池为空的情况下可以构造一个新实例。