Created
April 26, 2020 11:58
-
-
Save SergeyBurlaka/8b55039091345461f058eaa94a049961 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Helper class for creating pools of objects. An example use looks like this: | |
* <pre> | |
* public class MyPooledClass { | |
* | |
* private static final SynchronizedPool<MyPooledClass> sPool = | |
* new SynchronizedPool<MyPooledClass>(10); | |
* | |
* public static MyPooledClass obtain() { | |
* MyPooledClass instance = sPool.acquire(); | |
* return (instance != null) ? instance : new MyPooledClass(); | |
* } | |
* | |
* public void recycle() { | |
* // Clear state if needed. | |
* sPool.release(this); | |
* } | |
* | |
* . . . | |
* } | |
* </pre> | |
* | |
*/ | |
public final class Pools { | |
/** | |
* Interface for managing a pool of objects. | |
* | |
* @param <T> The pooled type. | |
*/ | |
public interface Pool<T> { | |
/** | |
* @return An instance from the pool if such, null otherwise. | |
*/ | |
@Nullable | |
T acquire(); | |
/** | |
* Release an instance to the pool. | |
* | |
* @param instance The instance to release. | |
* @return Whether the instance was put in the pool. | |
* | |
* @throws IllegalStateException If the instance is already in the pool. | |
*/ | |
boolean release(@NonNull T instance); | |
} | |
private Pools() { | |
/* do nothing - hiding constructor */ | |
} | |
/** | |
* Simple (non-synchronized) pool of objects. | |
* | |
* @param <T> The pooled type. | |
*/ | |
public static class SimplePool<T> implements Pool<T> { | |
private final Object[] mPool; | |
private int mPoolSize; | |
/** | |
* Creates a new instance. | |
* | |
* @param maxPoolSize The max pool size. | |
* | |
* @throws IllegalArgumentException If the max pool size is less than zero. | |
*/ | |
public SimplePool(int maxPoolSize) { | |
if (maxPoolSize <= 0) { | |
throw new IllegalArgumentException("The max pool size must be > 0"); | |
} | |
mPool = new Object[maxPoolSize]; | |
} | |
@Override | |
@SuppressWarnings("unchecked") | |
public T acquire() { | |
if (mPoolSize > 0) { | |
final int lastPooledIndex = mPoolSize - 1; | |
T instance = (T) mPool[lastPooledIndex]; | |
mPool[lastPooledIndex] = null; | |
mPoolSize--; | |
return instance; | |
} | |
return null; | |
} | |
@Override | |
public boolean release(@NonNull T instance) { | |
if (isInPool(instance)) { | |
throw new IllegalStateException("Already in the pool!"); | |
} | |
if (mPoolSize < mPool.length) { | |
mPool[mPoolSize] = instance; | |
mPoolSize++; | |
return true; | |
} | |
return false; | |
} | |
private boolean isInPool(@NonNull T instance) { | |
for (int i = 0; i < mPoolSize; i++) { | |
if (mPool[i] == instance) { | |
return true; | |
} | |
} | |
return false; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment