通过PoolObjectFactory接口</t>实例化Pool <t>类

时间:2015-01-06 16:58:46

标签: java android

以下是使用Java Pool(泛型池)为Android实例化TouchEvents的示例:

import java.util.ArrayList;
import java.util.List;

public class Pool<T> {
    public interface PoolObjectFactory<T> {
        public T createObject();
    }

    private final List<T> freeObjects;
    private final PoolObjectFactory<T> factory;
    private final int maxSize;

    public Pool(PoolObjectFactory<T> factory, int maxSize) {
        this.factory = factory;
        this.maxSize = maxSize;
        this.freeObjects = new ArrayList<T>(maxSize);
    }

    public T newObject() {
        T object = null;

        if (freeObjects.isEmpty()) {
            object = factory.createObject();
        } else {
            object = freeObjects.remove(freeObjects.size() - 1);
        }

        return object;
    }

    public void free(T object) {
        if (freeObjects.size() < maxSize) {
            freeObjects.add(object);
        }
    }
}

但是,我真的不明白这段代码是如何运作的:

if (freeObjects.isEmpty()) {
    object = factory.createObject();
} else {
    object = freeObjects.remove(freeObjects.size() - 1);
}

让我们说:

touchEventPool = new Pool<TouchEvent>(factory, 100);

这是否意味着它将存储一个包含100个事件的数组(当#101进入内部时,将会排除#1,就像先进先出一样)?

我认为它应该保留一些最大数量的对象,然后处理额外的。我读过10次书的描述......但是无法得到它。也许有人解释这是如何运作的?

3 个答案:

答案 0 :(得分:3)

  

我认为它应该保留一些最大数量的对象,然后处理额外的。我读了10次书的描述......但是无法得到它。也许有人解释这是如何运作的?

排序。该类在名为List的{​​{1}}中保留预先创建的对象的缓存。当您要求新对象(通过pool方法)时,它将首先检查newObject以查看对象是否可供使用。如果池为空,则只创建一个对象并将其返回给您。如果有可用的对象,它将删除pool中的最后一个元素并将其返回给您。

注释:

pool

当您将对象返回缓存时(通过if (freeObjects.isEmpty()) { // The pool is empty, create a new object. object = factory.createObject(); } else { // The pool is non-empty, retrieve an object from the pool and return it. object = freeObjects.remove(freeObjects.size() - 1); } 方法),只有在未满足池的最大大小时才会将其放回池中。

注释:

free()

如果已达到池的最大大小,则不会存储您正在释放的对象,并且(可能)会进行垃圾回收。

答案 1 :(得分:1)

任何池的想法都在于创建受控环境,其中(通常)当可以从池中重用一些未使用的空闲实例时,不需要创建新的(事件)实例。

创建时 touchEventPool = new Pool<TouchEvent>(factory, 100); 你希望100个实例在程序的任何特定时刻都足够了。

因此,当您想要获得第101个事件时,该过程可能会释放前5个,20个甚至99个事件,并且池将能够重用其中任何一个。

如果没有空闲实例,那么根据池策略,将创建新策略,或者请求者线程将等待其他线程释放一个并返回池。在这个特定的实现中,将创建一个新的。

答案 2 :(得分:1)

我认为对象池的主要概念是减少对象实例的频率。

  

这是否意味着它将存储一个包含100个事件的数组(当#101进入内部时,会像先进先出一样处理#1)?这是否意味着它将存储一个数组100个事件(当#101进入内部时,会像先进先出一样处理#1)?

我不这么认为。最大数量100表示​​freeObjects,但是当前正在使用对象。当一个物体不再使用时,你应该释放它。然后释放的对象将不会被描述,而是作为freeObject存储(max num表示这些备用对象的对象)。下次需要另一个新对象时,您不必实例化新对象。所需要的只是重用一个备用的freeObjects。

因此,您可以避免昂贵的对象实例化。它可以提高性能。