Java 中的命名参数习语

新手上路,请多包涵

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

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

一个小的代码示例就可以了。

原文由 Red Hyena 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 691
2 个回答

我认为在构造函数中模拟关键字参数的最佳 Java 习惯用法是生成器模式,在 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 的构造函数的正常参数。 (人们通常不会担心同一个参数被多次设置的情况。)

您可能还想查看 这篇博文(不是我写的)。

原文由 Laurence Gonsalves 发布,翻译遵循 CC BY-SA 2.5 许可协议

这是值得一提的:

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

所谓的 double-brace initializer 。它实际上是一个带有实例初始化器的匿名类。

原文由 irreputable 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏