对象池
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);