如何解决Joshua Bloch的Builder模式和PMD警告
|| 我使用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
中的私有字段是重复的。当私有字段的数量增加时,这将很烦人。有什么办法可以避免呢?
解决方法
关于如何删除重复项。
我会得到更多的反对意见:)但是也许是这样的吗?
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() {
}
}
,
披萨和
生成器重复。这将成为;这将是
烦人的时候私下数
领域越来越大。有没有
避免的方法?
我个人使用第三个私有静态值对象类来解决此问题,该对象类包含所有字段,并在构建器和主类中都使用它(字段访问由委托处理)。当然,这可能最终会增加行数/类数,但在您的构建器因大量字段和检查而变得复杂的情况下,这是非常宝贵的。
同样,在Pizza类上实际提供一个静态方法(使用必填字段构建Pizza对象)也没有什么害处。除非您当然不能确定强制字段是什么,否则除非担心强制字段在类演变过程中可能会更改。重点是,只要您经过很多思考就可以证明自己的行为合理(如Joshua Bloch所说),就可以知道自己知道自己在做什么就可以放心地忽略那些警告。 :-)
一次性代码段:
public class Pizza {
private final PizzaVO vo;
private static class PizzaVO {
int size;
boolean cheese;
boolean pepperoni;
boolean bacon;
}
public static class Builder {
private final PizzaVO vo = new PizzaVO();
public Builder(int size) {
vo.size = size;
}
public Builder cheese(boolean value) {
vo.cheese = value;
return this;
}
public Builder pepperoni(boolean value) {
vo.pepperoni = value;
return this;
}
public Builder bacon(boolean value) {
vo.bacon = value;
return this;
}
public Pizza build() {
return new Pizza(vo);
}
}
private Pizza(PizzaVO vo) {
this.vo = vo;
}
public int getSize() {
return vo.size;
}
// other getter setter methods as per your taste
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。