!275 新增 函数式懒加载加载器

Merge pull request !275 from Mr.Po/v5-dev
This commit is contained in:
Looly 2021-03-16 13:06:10 +08:00 committed by Gitee
commit d35dce9478
2 changed files with 112 additions and 0 deletions

View File

@ -0,0 +1,67 @@
package cn.hutool.core.lang.loader;
import cn.hutool.core.lang.Assert;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
* 函数式懒加载加载器<br>
* 传入用于生成对象的函数在对象需要使用时调用生成对象然后抛弃此生成对象的函数<br>
* 此加载器常用于对象比较庞大而不一定被使用的情况用于减少启动时资源占用问题<br>
* 继承自{@link LazyLoader}如何实现多线程安全由LazyLoader完成
*
* @param <T> 被加载对象类型
* @author Mr.Po
* @see cn.hutool.core.lang.loader.LazyLoader
*/
public final class LazyFunLoader<T> extends LazyLoader<T> {
/**
* 用于生成对象的函数
*/
private Supplier<T> supplier;
/**
* 构造
*
* @param supplier 用于生成对象的函数
*/
public LazyFunLoader(Supplier<T> supplier) {
Assert.notNull(supplier);
this.supplier = supplier;
}
@Override
protected T init() {
T t = this.supplier.get();
this.supplier = null;
return t;
}
/**
* 是否已经初始化
*
* @return /
*/
public boolean isInitialize() {
return this.supplier == null;
}
/**
* 如果已经初始化就执行传入函数
*
* @param consumer 待执行函数
*/
public void ifInitialized(Consumer<T> consumer) {
Assert.notNull(consumer);
// 已经初始化
if (this.isInitialize()) {
consumer.accept(this.get());
}
}
}

View File

@ -0,0 +1,45 @@
package cn.hutool.core.lang.loader;
import org.junit.Assert;
import org.junit.Test;
public class LazyFunLoaderTest {
static class BigObject {
private boolean isDestroy = false;
public void destroy() {
this.isDestroy = true;
}
}
@Test
public void test1() {
LazyFunLoader<BigObject> loader = new LazyFunLoader<>(BigObject::new);
Assert.assertNotNull(loader.get());
Assert.assertTrue(loader.isInitialize());
// 对于某些对象在程序关闭时需要进行销毁操作
loader.ifInitialized(BigObject::destroy);
Assert.assertTrue(loader.get().isDestroy);
}
@Test
public void test2() {
LazyFunLoader<BigObject> loader = new LazyFunLoader<>(BigObject::new);
// 若从未使用则可以避免不必要的初始化
loader.ifInitialized(it -> {
Assert.fail();
it.destroy();
});
Assert.assertFalse(loader.isInitialize());
}
}