我似乎最喜欢在构造函数中模拟关键字参数的Java惯用语是Builder模式,有效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();主要警告如下:
- 设置模式非常繁琐(如您所见)。除了计划在许多地方实例化的类以外,可能不值得。
- 没有编译时检查是否所有参数都只指定了一次。您可以添加运行时检查,也可以仅将其用于可选参数,并使必需参数成为Foo或Builder的构造函数的常规参数。(人们通常不必担心多次设置相同参数的情况。)
您可能还想查看此博客文章(不是我的)。



