我使用 Joshua Bloch 的 Builder 模式编写了一个类,类似于这个 Pizza 示例:
public class Pizza {
private int size;
private boolean cheese;
private boolean pepperoni;
private boolean bacon;
public static class Builder {
//required
private final int size;
//optional
private boolean cheese = false;
private boolean pepperoni = false;
private boolean bacon = false;
public Builder(int size) {
this.size = size;
}
public Builder cheese(boolean value) {
cheese = value;
return this;
}
public Builder pepperoni(boolean value) {
pepperoni = value;
return this;
}
public Builder bacon(boolean value) {
bacon = value;
return this;
}
public Pizza build() {
return new Pizza(this);
}
}
private Pizza(Builder builder) {
size = builder.size;
cheese = builder.cheese;
pepperoni = builder.pepperoni;
bacon = builder.bacon;
}
}
但 PMD 报告了 2 个警告:
- (指向方法 Builder.build())避免通过构造函数类外部的私有构造函数进行实例化。通过构造函数类外部的私有构造函数进行实例化通常会导致生成访问器。工厂方法或构造函数的非私有化可以消除这种情况。生成的类文件实际上是一个接口。它使访问类能够调用一个新的隐藏包范围构造函数,该构造函数将接口作为补充参数。这将私有构造函数有效地转换为具有包范围的构造函数,并且难以辨别。
- 类不能被实例化并且不提供任何静态方法或字段。不能使用具有私有构造函数且没有任何静态方法或字段的类。
我应该忽略这些警告吗?
Pizza
另一个问题:类中的私有字段Builder
是重复的。当私有字段的数量变大时,这会很烦人。有什么办法可以避免吗?