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