From 496857e67a4f3609009efe18d24372707dec222e Mon Sep 17 00:00:00 2001 From: "Mr.Po" <504919167@qq.com> Date: Tue, 16 Mar 2021 10:25:50 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=96=B0=E5=A2=9ELazyFunLoader?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/lang/loader/LazyFunLoader.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyFunLoader.java 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..0b609c47b --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/lang/loader/LazyFunLoader.java @@ -0,0 +1,46 @@ +package cn.hutool.core.lang.loader; + +import cn.hutool.core.lang.Assert; + +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; + + 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; + } +} From 41719e394c8a6c6112e5382695de2f4840dffdc0 Mon Sep 17 00:00:00 2001 From: "Mr.Po" <504919167@qq.com> Date: Tue, 16 Mar 2021 10:28:22 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/hutool/core/lang/loader/LazyFunLoader.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 index 0b609c47b..2295aa516 100644 --- 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 @@ -17,10 +17,14 @@ import java.util.function.Supplier; public final class LazyFunLoader extends LazyLoader { /** - * 对象生成函数 + * 用于生成对象的函数 */ private Supplier supplier; + /** + * 构造 + * @param supplier 用于生成对象的函数 + */ public LazyFunLoader(Supplier supplier) { Assert.notNull(supplier); this.supplier = supplier; From d848e8cbbd941f64a34a5c61c67317eb04a70131 Mon Sep 17 00:00:00 2001 From: "Mr.Po" <504919167@qq.com> Date: Tue, 16 Mar 2021 10:53:19 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ifInitialized()=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/lang/loader/LazyFunLoader.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 index 2295aa516..6432d45e0 100644 --- 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 @@ -2,6 +2,7 @@ package cn.hutool.core.lang.loader; import cn.hutool.core.lang.Assert; +import java.util.function.Consumer; import java.util.function.Supplier; /** @@ -23,6 +24,7 @@ public final class LazyFunLoader extends LazyLoader { /** * 构造 + * * @param supplier 用于生成对象的函数 */ public LazyFunLoader(Supplier supplier) { @@ -47,4 +49,17 @@ public final class LazyFunLoader extends LazyLoader { public boolean isInitialize() { return this.supplier == null; } + + /** + * 如果已经初始化,就执行传入函数 + * + * @param consumer 待执行函数 + */ + public void ifInitialized(Consumer consumer) { + + // 已经初始化 + if (this.isInitialize()) { + consumer.accept(this.get()); + } + } } From cbf16443dd7a033074183a4da51a0d9a1ecf4245 Mon Sep 17 00:00:00 2001 From: "Mr.Po" <504919167@qq.com> Date: Tue, 16 Mar 2021 10:56:56 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/lang/loader/LazyFunLoaderTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 hutool-core/src/test/java/cn/hutool/core/lang/loader/LazyFunLoaderTest.java 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..5155af838 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/lang/loader/LazyFunLoaderTest.java @@ -0,0 +1,42 @@ +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()); + + // 对于某些对象,在程序关闭时,需要进行销毁操作 + 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(); + }); + } +} From 35dd387cb9c2fc8856f2336240bfc2a940680d9c Mon Sep 17 00:00:00 2001 From: "Mr.Po" <504919167@qq.com> Date: Tue, 16 Mar 2021 11:01:17 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=A4=E5=AE=9A?= =?UTF-8?q?=E9=9D=9E=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/cn/hutool/core/lang/loader/LazyFunLoader.java | 2 ++ 1 file changed, 2 insertions(+) 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 index 6432d45e0..95832ce27 100644 --- 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 @@ -57,6 +57,8 @@ public final class LazyFunLoader extends LazyLoader { */ public void ifInitialized(Consumer consumer) { + Assert.notNull(consumer); + // 已经初始化 if (this.isInitialize()) { consumer.accept(this.get()); From b5e4ec95761b13b46e4ba65a6e3d472720accd3a Mon Sep 17 00:00:00 2001 From: "Mr.Po" <504919167@qq.com> Date: Tue, 16 Mar 2021 11:06:57 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/lang/loader/LazyFunLoaderTest.java | 3 +++ 1 file changed, 3 insertions(+) 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 index 5155af838..6de9cb529 100644 --- 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 @@ -20,6 +20,7 @@ public class LazyFunLoaderTest { LazyFunLoader loader = new LazyFunLoader<>(BigObject::new); Assert.assertNotNull(loader.get()); + Assert.assertTrue(loader.isInitialize()); // 对于某些对象,在程序关闭时,需要进行销毁操作 loader.ifInitialized(BigObject::destroy); @@ -38,5 +39,7 @@ public class LazyFunLoaderTest { Assert.fail(); it.destroy(); }); + + Assert.assertFalse(loader.isInitialize()); } }