diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyFunLoader.java b/hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyFunLoader.java new file mode 100644 index 000000000..95832ce27 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyFunLoader.java @@ -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; + +/** + * 函数式懒加载加载器
+ * 传入用于生成对象的函数,在对象需要使用时调用生成对象,然后抛弃此生成对象的函数。
+ * 此加载器常用于对象比较庞大而不一定被使用的情况,用于减少启动时资源占用问题
+ * 继承自{@link LazyLoader},如何实现多线程安全,由LazyLoader完成。 + * + * @param 被加载对象类型 + * @author Mr.Po + * @see cn.hutool.core.lang.loader.LazyLoader + */ +public final class LazyFunLoader extends LazyLoader { + + /** + * 用于生成对象的函数 + */ + private Supplier supplier; + + /** + * 构造 + * + * @param supplier 用于生成对象的函数 + */ + public LazyFunLoader(Supplier 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 consumer) { + + Assert.notNull(consumer); + + // 已经初始化 + if (this.isInitialize()) { + consumer.accept(this.get()); + } + } +} diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/loader/LazyFunLoaderTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/loader/LazyFunLoaderTest.java new file mode 100644 index 000000000..6de9cb529 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/lang/loader/LazyFunLoaderTest.java @@ -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 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 loader = new LazyFunLoader<>(BigObject::new); + + // 若从未使用,则可以避免不必要的初始化 + loader.ifInitialized(it -> { + + Assert.fail(); + it.destroy(); + }); + + Assert.assertFalse(loader.isInitialize()); + } +}