对象池

时间:2020-01-09 10:36:58  来源:igfitidea点击:

Mem Ops ObjectPool类能够合并可重用的对象实例。首先," ObjectPool"为空。当我们从ObjectPool请求实例时,将通过IObjectFactory创建一个新实例并返回给我们。以后再次释放对象时,该对象将在内部缓存。当我们将来再次请求一个实例时," ObjectPool"将首先检查它是否在内部缓存了任何实例。如果有,它将返回缓存的实例之一。如果没有,将创建一个新实例。

创建一个对象池

要使用Mem Ops ObjectPool,必须首先创建com.nanosai.memops.objects.ObjectPool类的实例。这是创建Mem OpsObjectPool'实例的方式:

IObjectFactory<MyClass> objectFactory = new IObjectFactory<MyClass>() {
    public MyClass instance() {  return new MyClass(); }
};

int capacity = 8;

ObjectPool<MyClass> objectPool = new ObjectPool<MyClass>(capacity, stringFactory);

注意,ObjectPool类的构造函数有两个参数:容量和IObjectFactory实现。以下各节将说明这两个参数。

容量

容量是" ObjectPool"将通过其" IObjectFactory"创建的最大实例数。如果我们从"对象池"请求一个对象实例,该对象实例没有被缓存的对象实例,并且已经创建了"容量"个对象,则将返回"空"。

在上面的示例中,容量设置为8. 这意味着最多可以创建8个MyClass实例。然后可以一次又一次地重用这8个实例,但是我们永远不能同时从池中获得8个以上的实例。一旦"获取"了8个对象,我们将需要释放一个对象,然后才能获取一个新对象。在此之前,将返回" null"。

IObjectFactory

ObjectPool构造函数的第二个参数是IObjectFactory实例。 " IObjectFactory"是Mem Ops特定的Java接口。我们必须自己提供IObjectFactory的实现。 "对象池"应该返回的任何对象都必须由" IObjectFactory"提供。首先是" IObjectFactory"实例的外观:

package com.nanosai.memops.objects;

public interface IObjectFactory<T> {
    public T instance();
}

如我们所见," IObjectFactory"仅包含一个名为" instance()"的方法。当我们实现IObjectFactory接口时,由instance()方法返回的类型由我们决定。我们可以在Java接口教程的Generic Java interfaces部分中阅读有关在Java接口中实现泛型类型的更多信息。

这是实现" IObjectFactory"接口的示例:

IObjectFactory<String> stringFactory = new IObjectFactory<String>() {
    int instanceNo = 0;

    @Override
    public String instance() {
        String value = "" + instanceNo;
        instanceNo++;
        return value;
    }
};

请注意如何将通用Java类型设置为Java字符串。

由于" IObjectFactory"接口仅包含一个方法,因此我们也可以使用Java Lambda表达式实现该方法。这是一个使用Java lambda表达式实现IObjectFactory接口的示例:

IObjectFactory<String> stringFactory =
    () -> "" + System.currentTimeMillis();

从ObjectPool获取对象实例

一旦创建了Mem OpsObjectPool实例,就可以从中获取一个对象实例。我们可以通过调用其instance()方法来实现。这是一个从ObjectPool获取对象实例的例子:

String instance = objectPool.instance();

释放对象

使用完对象实例后,应再次将其释放回" ObjectPool"。我们可以通过调用ObjectPoolfree()方法来释放对象实例以供重用。这是释放实例外观的示例:

objectPool.free(instance);