Java Build对象构建教程


如果你足够细心的话,可以发现越来越多的类库其对象初始化方式都不再是传统的构造器方式创建,而是通过 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 从而降低代码复杂度并提高可读性。


文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录