我已经写了使用约书亚布洛赫的Builder模式,这类似于这个比萨例子类:约书亚布洛赫的Builder模式和PMD警告
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
中的私有字段是重复的。当私人领域的数量变大时,这将会令人讨厌。有什么办法可以避免它?
for 1.你也许可以定义你的Pizza构造函数为package-protected。这也应该解决2. – Rom1 2011-05-30 09:33:47
模式是一个很好的; PMD只是愚蠢的。我个人会忽略它。 – skaffman 2011-05-30 09:43:05
只是一个侧面说明:我一直在使用一个名为[Make-It-Easy](http://code.google.com/p/make-it-easy/)的小框架,这有助于构建这个* builders *和代码是非常可读的。我主要将它用于我的单元测试,但它可以绝对用于生产代码。 – Augusto 2011-05-30 09:58:05