【发布时间】:2011-05-30 09:22:34
【问题描述】:
我使用 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 类中的私有字段是重复的。当私有字段的数量变大时,这会很烦人。有什么办法可以避免吗?
【问题讨论】:
-
for 1. 您可以将您的 Pizza 构造函数定义为包保护。这也应该解决 2.
-
图案不错; PMD只是愚蠢。我个人会忽略它。
-
只是一个旁注:我一直在使用一个名为Make-It-Easy 的小型框架,它有助于构建这个builders,并且代码可读性很强。我主要将它用于我的单元测试,但它绝对可以用于生产代码。
-
我会忽略第一个 PMD 警告。但是,第二个是合理的。您的 Pizza 类,就像您的问题一样,是不可用的,因为它没有任何方法。加入一些吸气剂,PMD 不会再抱怨了(希望如此)。
标签: java pmd builder-pattern