package scjlibs.util;
public class ObjectPool<E> {
private static final int DEFAULT_CAPACITY = 16;
protected final int MAX_OBJECTS;
protected PoolObject[] objects;
protected int usedObjects;
PoolObjectFactory factory;
public ObjectPool(PoolObjectFactory factory) {
this(DEFAULT_CAPACITY, factory);
}
public ObjectPool(int size, PoolObjectFactory factory) {
this.MAX_OBJECTS = size;
this.factory = factory;
objects = new PoolObject[MAX_OBJECTS];
for (int i = 0; i < MAX_OBJECTS; i++) {
objects[i] = factory.createObject();
}
}
public int usedObjects(){
return usedObjects;
}
public int maxObjects(){
return MAX_OBJECTS;
}
public synchronized E getPoolObject() {
PoolObject obj = null;
if (usedObjects >= MAX_OBJECTS) {
obj = null;
}
// TODO: Change to a red-black tree to reduce lookup delay
for (int i = 0; i < MAX_OBJECTS; i++) {
if (objects[i].isFree()) {
objects[i].initialize();
obj = objects[i];
usedObjects++;
break;
}
}
return (E) obj;
}
public synchronized void releasePoolObject(PoolObject object) {
object.finalize();
usedObjects--;
}
}