【问题标题】:Java Record Custom Constructor Selective ParametersJava 记录自定义构造函数选择性参数
【发布时间】:2021-12-23 19:40:34
【问题描述】:

我有记录:

public record Thing(
   Boolean field1,
   EnumType field2,
   int field3,
   String, field4
   . . .

我在Thing 中添加了很多新字段,这破坏了我所有使用规范构造函数的代码,并且字段堆积如山,这使得规范构造函数越来越难用。

我想做的是能够为任意字段传递特定值:

new Thing(field3 = 1, field4 = "XXX");
new Thing(field1 = true, field2 = ENUMVALUE);

现在,我知道我可以做如下构造函数:

Thing(int i, String s) ...
Thing(Boolean b, EnumType, e) ...
. . .
new Thing(1, "XXX");
new Thing(true, ENUMVALUE);

但这确实是一种不知道我想要覆盖哪些字段的默认值的情况。到目前为止,我唯一能想到的就是将 Thing 变成一个常规对象,这样我就可以执行以下操作:

new Thing().setField1(true).setField4("Blah");

这有点令人沮丧,因为我不希望值在初始化后就可变。

【问题讨论】:

  • 如果它是一个常规对象,您将无法将字段设置为最终的???
  • 我不确定我是否遵循,但 Java 记录是不可变的。因此,您不能在构造对象后设置值。这意味着必须通过构造函数注入所有值。也许你可以做一个包含其他记录的Java记录。
  • 你也可以使用 builder 模式

标签: java record


【解决方案1】:

不幸的是,Java 没有命名参数(至少目前是这样)。我们可以通过使用builder pattern 来克服这种缺失的语言功能。

对于记录,我们可以这样做:

public record Thing(Boolean field, int field2, String field3) {

    private Thing(ThingBuilder thingBuilder) {
        this(thingBuilder.field, thingBuilder.field2, thingBuilder.field3);
    }

    public static class ThingBuilder {
        // We can set default values for the fields
        private Boolean field = false;
        private int field2;
        private String field3 = "";

        public ThingBuilder() {}

        public ThingBuilder field(Boolean field) {
            this.field = field;
            return this;
        }

        public ThingBuilder field2(int field) {
            this.field2 = field;
            return this;
        }

        public ThingBuilder field3(String field) {
            this.field3 = field;
            return this;
        }

        public Thing build() {
            return new Thing(this);
        }
    }
}

我们可以通过以下方式构建Thing实例:

Thing thing = new Thing.ThingBuilder().field(true).field2(2).field3("some string").build();

此外,我们可以省略一些字段并让它们使用它们的默认值:

Thing thing = new Thing.ThingBuilder().field3("some string").build();

【讨论】:

  • 谢谢!我从来没有想过创建一个类来初始化记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 2021-12-17
  • 2020-12-08
  • 2018-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多