java - 构建器模式的抽象类
问题描述
我有现有的模型类,它们总是使用这样的构建器模式:
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
每次都写静态类了。
请指教。
解决方案
您还需要实施Builder
.
public class Model extends AbstractModel<Model>{
private Model(final Builder builder) {
super(builder);
}
public static class Builder2 extends AbstractModel.Builder<Model> {
@Override
public Model Build() {
return new Model(this);
}
}
}
然后可以调用
Model model = new Model.Builder2().Build();
编辑
另外,AbstractBuilder 的构造函数也必须是protected
.
protected AbstractModel(final Builder<? extends Builder<T>> builder) {
this.isValid = builder.isValid;
this.errorMessages = builder.getErrorMessages();
}
推荐阅读
- cloud-foundry - HTML5 应用程序 (Cloud Foundry) - 404 Not Found nginx
- redirect - IIS 重定向 多个域允许一个访问文件夹 - 拒绝访问另一个
- python - 如何将 mpmath 和 sympy 添加到 buildozer 要求中
- r - 如何使用设备进行并行绘图?
- machine-learning - 在哪里可以找到 BIG 数据集
- django - APITestCase 中的请求标头
- xamarin - 退出应用程序时在 Android 上的 Xamarin.Forms 中获取 NullReferenceException
- javascript - 如何用字母 React Hook 替换下划线
- azure-data-explorer - 用于获取到给定日期的累积计数的 Kusto 查询
- java - MPAndroidChart - 为什么线不显示?