我已经使用 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()) 避免通过外部的私有(private)构造函数进行实例化 构造函数的类。 通过私有(private)实例化 来自外部的构造函数 构造函数的类通常会导致 访问器的生成。一个工厂 方法,或非私有(private)化的 构造函数可以消除这个 情况。生成的类文件 实际上是一个接口(interface)。它给 访问类的能力 调用一个新的隐藏包范围 采用接口(interface)的构造函数 作为补充参数。这个 变成私有(private)构造函数 有效地与包合二为一 范围,并且具有挑战性 辨别。
- 类不能被实例化并且 不提供任何静态方法 或字段。一个有私有(private)的类 构造函数,并且没有任何 静态方法或字段不能 用过。
我应该忽略这些警告吗?
另一个问题:类Pizza
和Builder
中的私有(private)字段是重复的。当私有(private)字段的数量越来越大时,这会很烦人。有什么办法可以避免吗?
最佳答案
关于如何去除重复。
我会得到更多的反对票 :) 但也许是这样的?
class Pizza {
private int size;
private boolean cheese;
private boolean pepperoni;
private boolean bacon;
public static class Builder {
private Pizza pizza = new Pizza();
public Builder(int size) {
pizza.size = size;
}
public Builder cheese(boolean value) {
pizza.cheese = value;
return this;
}
public Builder pepperoni(boolean value) {
pizza.pepperoni = value;
return this;
}
public Builder bacon(boolean value) {
pizza.bacon = value;
return this;
}
public Pizza build() {
return pizza;
}
}
private Pizza() {
}
}
关于java - Joshua Bloch 的 Builder 模式和 PMD 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6174419/