86 lines
1.7 KiB
Java
86 lines
1.7 KiB
Java
package com.example.catchTheLetters.utils;
|
||
|
||
import org.jetbrains.annotations.NotNull;
|
||
|
||
import java.util.concurrent.ConcurrentLinkedDeque;
|
||
import java.util.function.Consumer;
|
||
import java.util.function.Supplier;
|
||
|
||
/**
|
||
* 对象池(防止频繁创建对象触发GC,必须继承)
|
||
* @param <T> 对象类型
|
||
* @author spyn
|
||
*/
|
||
public class ObjectPool<T> implements Iterable<T> {
|
||
/**
|
||
* 对象池
|
||
*/
|
||
private final ConcurrentLinkedDeque<T> pool;
|
||
|
||
/**
|
||
* 创建对象委托
|
||
*/
|
||
private final Supplier<T> factory;
|
||
|
||
/**
|
||
* 重置对象委托
|
||
*/
|
||
private final Consumer<T> reset;
|
||
|
||
/**
|
||
* 构造函数
|
||
* @param factory 创建对象委托
|
||
* @param reset 重置对象委托
|
||
*/
|
||
public ObjectPool(Supplier<T> factory, Consumer<T> reset) {
|
||
this.pool = new ConcurrentLinkedDeque<>();
|
||
this.factory = factory;
|
||
this.reset = reset;
|
||
}
|
||
|
||
/**
|
||
* 取出一个对象
|
||
* @return 对象
|
||
*/
|
||
public T borrowObject() {
|
||
T object;
|
||
if ((object = pool.pollFirst()) == null) {
|
||
object = (T) factory.get();
|
||
}
|
||
return object;
|
||
}
|
||
|
||
/**
|
||
* 存入一个对象
|
||
* @param object 对象
|
||
*/
|
||
public void returnObject(T object) {
|
||
if (object == null) {
|
||
return;
|
||
}
|
||
reset.accept(object);
|
||
this.pool.push(object);
|
||
}
|
||
|
||
/**
|
||
* 清空对象池
|
||
*/
|
||
public void clear() {
|
||
this.pool.clear();
|
||
}
|
||
|
||
/**
|
||
* 覆写迭代器,便于遍历对象池
|
||
*/
|
||
@NotNull
|
||
@Override
|
||
public java.util.Iterator<T> iterator() {
|
||
return this.pool.iterator();
|
||
}
|
||
|
||
@Override
|
||
public String toString() {
|
||
return this.pool.toString();
|
||
}
|
||
}
|