在Java中命名参数成语

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (46)

如何在Java中实现命名参数成语?(特别是对于构造函数)

我正在寻找一种类似于Objective-C的语法,而不像JavaBeans中使用的语法。

一个小代码的例子会很好。

提问于
用户回答回答于

我看起来用于模拟构造函数中的关键字参数的最好的Java成语是Builder模式,在Effective Java 2nd Edition中进行了描述。

基本的想法是有一个Builder类,它为不同的构造函数参数提供了setter(但通常不是getter)。还有一种build()方法。Builder类通常是它用来构建的类的(静态)嵌套类。外部类的构造函数通常是私有的。

最终结果如下所示:

public class Foo {
  public static class Builder {
    public Foo build() {
      return new Foo(this);
    }

    public Builder setSize(int size) {
      this.size = size;
      return this;
    }

    public Builder setColor(Color color) {
      this.color = color;
      return this;
    }

    public Builder setName(String name) {
      this.name = name;
      return this;
    }

    // you can set defaults for these here
    private int size;
    private Color color;
    private String name;
  }

  public static Builder builder() {
      return new Builder();
  }

  private Foo(Builder builder) {
    size = builder.size;
    color = builder.color;
    name = builder.name;
  }

  private final int size;
  private final Color color;
  private final String name;

  // The rest of Foo goes here...
}

要创建Foo的实例,您可以编写如下内容:

Foo foo = Foo.builder()
    .setColor(red)
    .setName("Fred")
    .setSize(42)
    .build();

主要的注意事项是:

  1. 设置模式非常冗长(如您所见)。除了您计划在许多地方实例化的课程,可能不值得。
  2. 没有编译时检查,所有参数都只被指定一次。您可以添加运行时检查,也可以将其仅用于可选参数,并将所需参数的正常参数设置为Foo或Builder的构造函数。(人们通常不会担心多次设置相同参数的情况。)
用户回答回答于

值得一提的是:

Foo foo = new Foo() {{
    color = red;
    name = "Fred";
    size = 42;
}};

所谓的双括号初始值设定项。它实际上是一个具有实例初始值设定项的匿名类。

扫码关注云+社区