如果你足够细心的话,可以发现越来越多的类库其对象初始化方式都不再是传统的构造器方式创建,而是通过 build
方式创建。那 build
方式构造对象和基础的构建器初始化对象又有什么区别?在代码中又该如何使用 build
构造器?又应当在什么应用场景下使用呢?
下面就逐一解答上述几个疑问,让我们进入正文吧。
一、示例介绍
下面以常用的网络请求类库 OkHttp
为例,其 Request
对象创建正是通过 build
方式实现。
如下示例中通过 build 方式创建了一个基本的 post
类型请求对象。
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
二、配置教程
1. 实现原理
build
方式构建的对象的原理十分简单,就是通过内部类实现数据赋值的一个过程。
2. 代码实现
新建 TestProperty
类用于后续初始化创建,其中 Builder
内部类正是实现 build
方式初始化关键。
TestProperty
类的完整代码如下:
public class TestProperty {
private String id;
private String name;
private String describer;
private TestProperty(Builder builder) {
this.id = builder.id;
this.name = builder.name;
this.describer = builder.describer;
}
public static Builder builder() {
return new Builder();
}
public static class Builder {
private String id;
private String name;
private String describer;
public Builder id(String val) {
this.id = val;
return this;
}
public Builder name(String val) {
this.name = val;
return this;
}
public Builder describer(String val) {
this.describer = val;
return this;
}
public TestProperty build() {
return new TestProperty(this);
}
}
}
3. 效果展示
完成上述 TestProperty
类的创建之后,下面就使用其并通过 build
方式创建对象。
通过下述的示例代码可以看到 build
方式创建的两个测试对象我们可以清晰的明白对象每个属性字段赋予的值,并且提供可以随意打乱赋值顺序而无需创建对应的构造器。
@Test
public void demo() {
TestProperty property1 = TestProperty.builder()
.id("123456")
.describe("I am Alex")
.build();
System.out.println(property1.toString());
TestProperty property2 = TestProperty.builder()
.name("Beth")
.describe("I am Beth")
.build();
System.out.println(property2.toString());
}
三、总结归纳
下面就对 build
方式创建对象进行简单的归纳,总结一下其优点与适用场景。
当一个类包含多个属性字段时,通过 build
方式初始化对象则无需在定义时声明多个构造器,从而大大降低代码复杂度。同时传统的构造器方式在面对大量字段时初始化时很难核对每个字段赋予的属性值,build
同样可以解决这一痛点。
总而言之,当一个实体类的属性字段超过一定数量时,即可考虑使用 build
从而降低代码复杂度并提高可读性。