/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.common.objectpool;
import javax.annotation.Nullable;
import com.facebook.common.time.MonotonicClock;
/**
* Builder interface for constructing a new pool
* @param <T>
*/
public class ObjectPoolBuilder<T> {
private Class<T> mClazz;
private int mMinSize = DEFAULT_MIN_SIZE;
private int mMaxSize = DEFAULT_MAX_SIZE;
private int mIncrementSize = DEFAULT_INCREMENT_SIZE;
private long mCompactionDelayMs = DEFAULT_COMPACTION_DELAY_MS;
private ObjectPool.Allocator<T> mAllocator;
private MonotonicClock mClock;
private final ObjectPoolManager mManager;
public static final int DEFAULT_MIN_SIZE = 16;
public static final int DEFAULT_MAX_SIZE = 1024;
public static final int DEFAULT_INCREMENT_SIZE = 16;
public static final long DEFAULT_COMPACTION_DELAY_MS = 60 * 1000;
// Generic constructor which does not attach to any specific manager
public ObjectPoolBuilder(Class<T> clazz, MonotonicClock clock) {
this(null, clazz, clock);
}
// Constructor which will attach the built pool to the specified pool manager
/* package */ ObjectPoolBuilder(
@Nullable ObjectPoolManager manager,
Class<T> clazz,
MonotonicClock clock) {
mManager = manager;
mClazz = clazz;
mClock = clock;
}
public ObjectPoolBuilder<T> setMinimumSize(int size) {
mMinSize = size;
return this;
}
public int getMinimumSize() {
return mMinSize;
}
public ObjectPoolBuilder<T> setMaximumSize(int size) {
mMaxSize = size;
return this;
}
public int getMaximumSize() {
return mMaxSize;
}
public ObjectPoolBuilder<T> setIncrementSize(int size) {
mIncrementSize = size;
return this;
}
public int getIncrementSize() {
return mIncrementSize;
}
public ObjectPoolBuilder<T> setCompactionDelay(long delayMs) {
mCompactionDelayMs = delayMs;
return this;
}
public long getCompactionDelay() {
return mCompactionDelayMs;
}
public ObjectPoolBuilder<T> setAllocator(ObjectPool.Allocator<T> alloc) {
mAllocator = alloc;
return this;
}
public ObjectPool.Allocator<T> getAllocator() {
return mAllocator;
}
public ObjectPoolBuilder<T> setClock(MonotonicClock clock) {
mClock = clock;
return this;
}
public MonotonicClock getClock() {
return mClock;
}
public ObjectPool<T> build() {
if (mClock == null) {
throw new IllegalArgumentException("Must add a clock to the object pool builder");
}
ObjectPool.Allocator<T> alloc = mAllocator;
if (alloc == null) {
alloc = new ObjectPool.BasicAllocator<T>(mClazz);
}
ObjectPool<T> pool = new ObjectPool<T>(mClazz, mMinSize, mMaxSize, mIncrementSize,
mCompactionDelayMs, alloc, mClock);
if (mManager != null) {
mManager.addPool(mClazz, pool);
}
return pool;
}
}