[英]Using a Builder Pattern when a multiple classes inherits a single abstract class
我正在使用兩個實體構建 web 應用程序:
這兩個類繼承自抽象的 class Book。 這本書 class 將具有兩個類的公共變量:id、title、releaseDate、coverID;
我正在使用 Pattern Builder 來創建 Manga 和 Volume 對象。 但是當我嘗試 setDescription 時,我收到了這個錯誤:
Manga manga = (Manga) new Manga.Builder().setID(id)
.setTitle(title)
.setCoverID(id)
.setDescription() //Cannot resolve method 'setDescription' in 'Builder'
.build();
預訂 class:
公共抽象 class Book<T extends Book> {
public final Long id;
public final String title;
protected Book(final Builder<T> builder) {
this.id = builder.id;
this.title = builder.title;
}
public abstract static class Builder<T> {
private Long id;
private String title;
public Builder<T> setID(Long id) {
this.id = id;
return this;
}
public Builder<T> setTitle(String title) {
this.title = title;
return this;
}
public abstract T build();
}
我的漫畫 class:
public class Manga extends Book<Manga> {
private final String description;
protected Manga(Builder builder) {
super(builder);
this.description = builder.description;
}
public static class Builder extends Book.Builder<Manga> {
private String description;
public Builder setDescription(String description) {
this.description = description;
return this;
}
@Override
public Manga build() {
return new Manga(this);
}
}
還是有更好的解決方案?
謝謝。
這應該工作:
package de.dwosch;
public abstract class Book {
public final Long id;
public final String title;
protected Book(final Builder<?> builder) {
this.id = builder.id;
this.title = builder.title;
}
public abstract static class Builder<T extends Builder<T>> {
private Long id;
private String title;
public T id(Long id) {
this.id = id;
return me();
}
public T title(String title) {
this.title = title;
return me();
}
public abstract T me();
public abstract Book build();
}
}
接着
package de.dwosch;
public class Manga extends Book {
private final String description;
protected Manga(Builder builder) {
super(builder);
this.description = builder.description;
}
public static class Builder extends Book.Builder<Builder> {
private String description;
public Builder description(String description) {
this.description = description;
return this;
}
@Override
public Builder me() {
return this;
}
@Override
public Manga build() {
return new Manga(this);
}
}
}
用法
Manga manga = new Manga.Builder().description("test")
.title("title")
.build();
我已經多次實現了這種模式。 Joshua Bloch 在他的書 Effective Java (順便說一句很棒的書)中寫道。
如果您需要這方面的更多信息,請告訴我。
順便說一句:個人偏好 - 沒有在構建器流程上set
的設置器方法。 看起來“更干凈”:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.