From c0d2b8c9e38ea39185c7001a2f7936f2d38aaa03 Mon Sep 17 00:00:00 2001
From: TomXin <766781886@qq.com>
Date: Sun, 30 Jan 2022 14:06:43 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=87=8D=E8=BD=BDGenericBuil?=
=?UTF-8?q?der=E7=9A=84of=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=94=AF=E6=8C=81?=
=?UTF-8?q?=E6=9C=89=E5=8F=82=E6=9E=84=E9=80=A0(=E6=9C=80=E5=A4=9A5?=
=?UTF-8?q?=E4=B8=AA)=E7=9A=84=E8=B0=83=E7=94=A8;=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E9=87=8D=E8=BD=BDwith=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=94=AF?=
=?UTF-8?q?=E6=8C=81=E6=97=A0=E5=8F=82=E6=96=B9=E6=B3=95=E8=B0=83=E7=94=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../hutool/core/builder/GenericBuilder.java | 252 ++++++++++++++++--
.../core/builder/GenericBuilderTest.java | 28 +-
2 files changed, 262 insertions(+), 18 deletions(-)
diff --git a/hutool-core/src/main/java/cn/hutool/core/builder/GenericBuilder.java b/hutool-core/src/main/java/cn/hutool/core/builder/GenericBuilder.java
index b8da21486..45bde1e3d 100644
--- a/hutool-core/src/main/java/cn/hutool/core/builder/GenericBuilder.java
+++ b/hutool-core/src/main/java/cn/hutool/core/builder/GenericBuilder.java
@@ -11,25 +11,32 @@ import java.util.function.Supplier;
*
使用方法如下:
*
* Box box = GenericBuilder
- * .of(Box::new)
- * .with(Box::setId, 1024L)
- * .with(Box::setTitle, "Hello World!")
- * .with(Box::setLength, 9)
- * .with(Box::setWidth, 8)
- * .with(Box::setHeight, 7)
- * .build();
+ * .of(Box::new)
+ * .with(Box::setId, 1024L)
+ * .with(Box::setTitle, "Hello World!")
+ * .with(Box::setLength, 9)
+ * .with(Box::setWidth, 8)
+ * .with(Box::setHeight, 7)
+ * .build();
*
*
*
* 我们也可以对已创建的对象进行修改:
*
* Box boxModified = GenericBuilder
- * .of(() -> box)
- * .with(Box::setTitle, "Hello Friend!")
- * .with(Box::setLength, 3)
- * .with(Box::setWidth, 4)
- * .with(Box::setHeight, 5)
- * .build();
+ * .of(() -> box)
+ * .with(Box::setTitle, "Hello Friend!")
+ * .with(Box::setLength, 3)
+ * .with(Box::setWidth, 4)
+ * .with(Box::setHeight, 5)
+ * .build();
+ *
+ * 我们还可以对这样调用有参构造,这对于创建一些在有参构造中包含初始化函数的对象是有意义的
+ *
+ * Box box1 = GenericBuilder
+ * .of(Box::new, 2048L, "Hello Partner!", 222, 333, 444)
+ * .with(Box::alis)
+ * .build();
*
*
* @author TomXin
@@ -43,7 +50,7 @@ public class GenericBuilder implements Builder {
private final Supplier instantiator;
/**
- * 修改器集合
+ * 修改器列表
*/
private final List> modifiers = new ArrayList<>();
@@ -57,7 +64,7 @@ public class GenericBuilder implements Builder {
}
/**
- * 通过实例化器创建GenericBuilder
+ * 通过无参数实例化器创建GenericBuilder
*
* @param instant 实例化器
* @param 目标类型
@@ -67,6 +74,109 @@ public class GenericBuilder implements Builder {
return new GenericBuilder<>(instant);
}
+ /**
+ * 通过1参数实例化器创建GenericBuilder
+ *
+ * @param instant 实例化器
+ * @param p1 参数一
+ * @param 目标类型
+ * @param 参数一类型
+ * @return GenericBuilder对象
+ */
+ public static GenericBuilder of(Supplier1 instant, P1 p1) {
+ Supplier s = () -> instant.get(p1);
+ return new GenericBuilder<>(s);
+ }
+
+ /**
+ * 通过2参数实例化器创建GenericBuilder
+ *
+ * @param instant 实例化器
+ * @param p1 参数一
+ * @param p2 参数二
+ * @param 目标类型
+ * @param 参数一类型
+ * @param 参数二类型
+ * @return GenericBuilder对象
+ */
+ public static GenericBuilder of(Supplier2 instant, P1 p1, P2 p2) {
+ Supplier s = () -> instant.get(p1, p2);
+ return new GenericBuilder<>(s);
+ }
+
+ /**
+ * 通过3参数实例化器创建GenericBuilder
+ *
+ * @param instant 实例化器
+ * @param p1 参数一
+ * @param p2 参数二
+ * @param p3 参数三
+ * @param 目标类型
+ * @param 参数一类型
+ * @param 参数二类型
+ * @param 参数三类型
+ * @return GenericBuilder对象
+ */
+ public static GenericBuilder of(Supplier3 instant, P1 p1, P2 p2, P3 p3) {
+ Supplier s = () -> instant.get(p1, p2, p3);
+ return new GenericBuilder<>(s);
+ }
+
+ /**
+ * 通过4参数实例化器创建GenericBuilder
+ *
+ * @param instant 实例化器
+ * @param p1 参数一
+ * @param p2 参数二
+ * @param p3 参数三
+ * @param p4 参数四
+ * @param 目标类型
+ * @param 参数一类型
+ * @param 参数二类型
+ * @param 参数三类型
+ * @param 参数四类型
+ * @return GenericBuilder对象
+ */
+ public static GenericBuilder of(Supplier4 instant, P1 p1, P2 p2, P3 p3, P4 p4) {
+ Supplier s = () -> instant.get(p1, p2, p3, p4);
+ return new GenericBuilder<>(s);
+ }
+
+ /**
+ * 通过5参数实例化器创建GenericBuilder
+ *
+ * @param instant 实例化器
+ * @param p1 参数一
+ * @param p2 参数二
+ * @param p3 参数三
+ * @param p4 参数四
+ * @param p5 参数五
+ * @param 目标类型
+ * @param 参数一类型
+ * @param 参数二类型
+ * @param 参数三类型
+ * @param 参数四类型
+ * @param 参数五类型
+ * @return GenericBuilder对象
+ */
+ public static GenericBuilder of(Supplier5 instant, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
+ Supplier s = () -> instant.get(p1, p2, p3, p4, p5);
+ return new GenericBuilder<>(s);
+ }
+
+
+ /**
+ * 调用无参数方法
+ *
+ * @param consumer 无参数Consumer
+ * @return GenericBuilder对象
+ */
+ public GenericBuilder with(Consumer consumer) {
+ modifiers.add(consumer);
+ return this;
+ }
+
+
/**
* 调用1参数方法
*
@@ -170,6 +280,118 @@ public class GenericBuilder implements Builder {
return value;
}
+
+ /**
+ * 1参数Supplier
+ *
+ * @param 目标类型
+ * @param 参数一类型
+ */
+ @FunctionalInterface
+ public interface Supplier1 {
+ /**
+ * 生成实例的方法
+ *
+ * @param p1 参数一
+ * @return 目标对象
+ */
+ T get(P1 p1);
+ }
+
+
+ /**
+ * 2参数Supplier
+ *
+ * @param 目标类型
+ * @param 参数一类型
+ * @param 参数二类型
+ */
+ @FunctionalInterface
+ public interface Supplier2 {
+
+ /**
+ * 生成实例的方法
+ *
+ * @param p1 参数一
+ * @param p2 参数二
+ * @return 目标对象
+ */
+ T get(P1 p1, P2 p2);
+ }
+
+ /**
+ * 3参数Supplier
+ *
+ * @param 目标类型
+ * @param 参数一类型
+ * @param 参数二类型
+ * @param 参数三类型
+ */
+ @FunctionalInterface
+ public interface Supplier3 {
+
+ /**
+ * 生成实例的方法
+ *
+ * @param p1 参数一
+ * @param p2 参数二
+ * @param p3 参数三
+ * @return 目标对象
+ */
+ T get(P1 p1, P2 p2, P3 p3);
+ }
+
+
+ /**
+ * 4参数Supplier
+ *
+ * @param 目标类型
+ * @param 参数一类型
+ * @param 参数二类型
+ * @param 参数三类型
+ * @param 参数四类型
+ */
+ @FunctionalInterface
+ public interface Supplier4 {
+
+ /**
+ * 生成实例的方法
+ *
+ * @param p1 参数一
+ * @param p2 参数二
+ * @param p3 参数三
+ * @param p4 参数四
+ * @return 目标对象
+ */
+ T get(P1 p1, P2 p2, P3 p3, P4 p4);
+ }
+
+ /**
+ * 5参数Supplier
+ *
+ * @param 目标类型
+ * @param 参数一类型
+ * @param 参数二类型
+ * @param 参数三类型
+ * @param 参数四类型
+ * @param 参数五类型
+ */
+ @FunctionalInterface
+ public interface Supplier5 {
+
+ /**
+ * 生成实例的方法
+ *
+ * @param p1 参数一
+ * @param p2 参数二
+ * @param p3 参数三
+ * @param p4 参数四
+ * @param p5 参数五
+ * @return 目标对象
+ */
+ T get(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5);
+ }
+
/**
* 1参数Consumer
*/
diff --git a/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java b/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java
index 0ac1cd728..b3753e62d 100644
--- a/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/builder/GenericBuilderTest.java
@@ -1,8 +1,7 @@
package cn.hutool.core.builder;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
+import cn.hutool.core.util.StrUtil;
+import lombok.*;
import org.junit.Test;
/**
@@ -31,6 +30,11 @@ public class GenericBuilderTest {
.with(Box::setHeight, 5)
.build();
System.out.println(boxModified);
+ Box box1 = GenericBuilder
+ .of(Box::new, 2048L, "Hello Partner!", 222, 333, 444)
+ .with(Box::alis)
+ .build();
+ System.out.println(box1);
}
@Getter
@@ -42,6 +46,24 @@ public class GenericBuilderTest {
private Integer length;
private Integer width;
private Integer height;
+ private String titleAlias;
+
+ public Box() {
+ }
+
+ public Box(Long id, String title, Integer length, Integer width, Integer height) {
+ this.id = id;
+ this.title = title;
+ this.length = length;
+ this.width = width;
+ this.height = height;
+ }
+
+ public void alis() {
+ if (StrUtil.isNotBlank(this.title)) {
+ this.titleAlias = "TomXin:\"" + title + "\"";
+ }
+ }
}
}