[英]Abstract class for builder pattern
我有一些始终使用构建器模式的现有模型类,如下所示:
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
类构建Model
? 我认为最好向您展示如何编写程序,而不是仅将其“结合”在一起。 好吧,让我们从Model
类开始。
假设Model
类不能在没有Builder
情况下构造。 然后将Builder
类添加到Model
类是否有意义? 简短的回答:不,不会。 而是, Builder
类应包含Model
类作为非静态内部类。
/**
* The {@code Builder} can construct new instances of the {@code Model} class.
*
* @see Model
*/
public class Builder
{
private final String[] log;
/**
* The {@code Model} class can do something. You can only construct it through a {@code Builder}.
*
* @see Builder
*/
public class Model
{
private final Builder builder;
/**
* Constructs a new {@code Model} with the specified argument.
*
* @param builder the {@code Builder} that constructed the model.
*/
public Model(final Builder builder)
{
this.builder = builder;
}
/**
* Returns the associated {@code Builder}.
*
* @return the builder that constructed the model.
*/
public Builder getBuilder()
{
return this.builder;
}
}
/**
* Constructs a new instance of the {@code Builder} class with the specified argument.
*
* @param log the log of the {@code Builder}.
*/
public Builder(final String... log)
{
this.log = log;
}
/**
* Tries to {@code build} a new instance of the {@code Model} class.
*
* @return the constructed {@code Model}.
*/
public Model build()
{
return new Model(this);
}
/**
* Returns the log of the {@code Builder}.
*
* @return an log.
*/
public String[] getLog()
{
return this.log;
}
/**
* Determines whether or not the {@code Builder} is valid.
*
* @return {@code true} when the specified {@code log} is not {@code null}; {@code false} otherwise.
*/
public boolean isValid()
{
return this.log != null;
}
}
除了Builder
之外,没有其他类可以构造Model
。 但是,如果您构造了Builder
类的新实例并获得了调用build
方法的结果,则可以访问所有public
变量和方法。
如果您知道要构造一个Model
,则可以这样做:
Builder.Model model = new Builder().build();
如果您不想要Builder.
前缀,只需添加导入Model
类的import语句。
import organisation.projectname.pathToBuilder.Builder.Model;
您还需要实现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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.