【发布时间】:2018-05-13 08:44:12
【问题描述】:
我现有的模型类总是使用这样的构建器模式:
public class Model {
public static class Builder {
private boolean isValid;
private List<String> errorMessagesOrNull;
public Builder setIsValid(final boolean isValid) {
this.isValid = isValid;
return this;
}
public Builder setErrorMessages(final List<String> errorMessages) {
this.errorMessagesOrNull = errorMessages;
return this;
}
public List<String> getErrorMessages() {
return this.errorMessagesOrNull == null ? new ArrayList<>() : this.errorMessagesOrNull;
}
public Model Build() {
return new Model(this);
}
}
private boolean isValid;
private List<String> errorMessages;
private Model(final Builder builder) {
this.isValid = builder.isValid;
this.errorMessages = builder.getErrorMessages();
}
public boolean getIsValid() {
return isValid;
}
public List<String> getErrorMessages() {
return errorMessages;
}
}
如您所见,模型类始终具有isValid 和errorMessages。我想写一个抽象类来最小化那些模型类的重复逻辑。
所以我想出了这个抽象类:
public abstract class AbstractModel<T extends AbstractModel<T>> {
public static abstract class Builder<T> {
private boolean isValid;
private List<String> errorMessagesOrNull;
public Builder<T> setIsValid(final boolean isValid) {
this.isValid = isValid;
return this;
}
public Builder<T> setErrorMessages(final List<String> errorMessages) {
this.errorMessagesOrNull = errorMessages;
return this;
}
public List<String> getErrorMessages() {
return this.errorMessagesOrNull == null ? new ArrayList<>() : this.errorMessagesOrNull;
}
public abstract T Build();
}
private boolean isValid;
private List<String> errorMessages;
private AbstractModel(final Builder<T> builder) {
this.isValid = builder.isValid;
this.errorMessages = builder.getErrorMessages();
}
public boolean getIsValid() {
return isValid;
}
public List<String> getErrorMessages() {
return errorMessages;
}
}
但它并没有真正按我的预期工作。当我扩展抽象类时:
public class Model extends AbstractModel<Model> {
// Empty here since all fields are extended
}
我不能这样做:
Model model = new Model.Builder.setIsValid(true).Build();
我希望抽象类有Builder静态类,这样就不用每次都写静态类Builder了。
请指教。
【问题讨论】:
-
Model类甚至没有extendAbstractModel<T extends AbstractModel>类。 -
@Theikon 我更新了问题 - 抱歉,请看一下
-
你为什么要把它变成内部的和静态的?
-
我猜这只是我的偏好@YassinHajaj
标签: java design-patterns abstract-class