CatchTheLettersBackend/src/main/java/com/example/catchTheLetters/utils/ObjectPool.java

86 lines
1.7 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}