Я написал класс, используя шаблон 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
дублируются. Это будет раздражать, когда количество приватных полей станет больше. Есть ли способ избежать этого?