Joshua BlochのBuilderパターンを使用してクラスを作成しました。これは、このピザの例に似ています。
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
が重複しています。プライベートフィールドの数が増えると、これは厄介になります。それを回避する方法はありますか?