使用 Lombok 带来了很多便利,不用多说,是真的香,东西是好东西,就是要团队规范一起使用,避免踩坑。更多工具系列使用文章请关注公众号Java技术栈,在菜单中阅读。
Java 8 实现 Builder 模式Java 8 带来了函数式接口编程,所以在 Java 8 中可以一个实现通用的 Builder:
public class GenericBuilder<T> { private final Supplier<T> instantiator; private List<Consumer<T>> instanceModifiers = new ArrayList<>(); public GenericBuilder(Supplier<T> instantiator) { this.instantiator = instantiator; } public static <T> GenericBuilder<T> of(Supplier<T> instantiator) { return new GenericBuilder<T>(instantiator); } public <U> GenericBuilder<T> with(BiConsumer<T, U> consumer, U value) { Consumer<T> c = instance -> consumer.accept(instance, value); instanceModifiers.add(c); return this; } public T build() { T value = instantiator.get(); instanceModifiers.forEach(modifier -> modifier.accept(value)); instanceModifiers.clear(); return value; } }参考:
使用方式:
/** * @author: 栈长 * @from: 公众号Java技术栈 */ private static void testJava8Builder() { Java8Task java8Task = GenericBuilder.of(Java8Task::new) .with(Java8Task::setId, 99L) .with(Java8Task::setName, "紧急任务") .with(Java8Task::setType, 1) .with(Java8Task::setContent, "处理一下这个任务") .with(Java8Task::setStatus, 0) .with(Java8Task::setFinishDate, new Date()) .build(); System.out.println(java8Task); }这样一来,任何带有默认构造器和 set 方法的类都可以使用这个通用的 Builder 模式了。
虽然利用 Java 8 是实现了通用有 Builder 模式,但还是有很多冗余的代码,而且本质还是调用的 set 方法,所以和 set 比起来只是多了一个链式调用而已。
Spring Boot 中的 Builder 模式Spring Boot 是现在主流的应用框架,其中也用到了 Builder 模式,可见 Builder 模式的常见性。
下面再来看下 Spring Boot 是怎么应用 Builder 模式的:
new SpringApplicationBuilder() .sources(Parent.class) .child(Application.class) .bannerMode(Banner.Mode.OFF) .run(args);如上代码所示,这是 Spring Boot 的链式启动方式。
Spring Boot 基础教程看这里:
https://github.com/javastacks/spring-boot-best-practice
我们来看它是怎么做的:
它是新增了一个 XxxBuilder 类:SpringApplicationBuilder,然后在 SpringApplicationBuilder 中新增了个 SpringApplication 的成员变量,然后再新增变量对应的方法。
所以,Spring Boot 只是用 SpringApplicationBuilder 包装了一下 SpringApplication 而已,写法有所不同,但中心思想都是一样的。这里就不再演示了,大家也可以了借鉴一下。
总结本文说了同事写的疯狂的类构造器,然后再介绍了用 set 方法改良,以及使用 4 种 Builder 模式改良的方式,下面来总结一下吧:
常规的 Builder 模式
Lombok 实现 Builder 模式(推荐)
Java 8 实现 Builder 模式
Spring Boot 中的 Builder 模式
如果团队有使用 Lombok,那么 Lombok 无疑是最佳推荐的方式,代码量少,使用简单,方便维护。其他三种实现方式都各有利弊,大家都可以参考使用。
总之,别再写疯狂的类构造器了……
如果你在公司看到同事写这样的优秀代码,请把这篇文章发给他。
好了,今天的分享就到这里了,后面栈长我会更新更多 Java 技术实战及设计模式系列文章,公众号Java技术栈第一时间推送。
本节教程所有实战源码已上传到这个仓库:
https://github.com/javastacks/javastack
最后,觉得我的文章对你用收获的话,动动小手,给个在看、转发,原创不易,栈长需要你的鼓励。