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 + "\""; + } + } } }