Java 当多个类继承单个抽象类时使用生成器模式
我正在使用两个实体构建web应用程序:Java 当多个类继承单个抽象类时使用生成器模式,java,abstract-class,builder,Java,Abstract Class,Builder,我正在使用两个实体构建web应用程序: 漫画id、标题、发行日期、封面id、流派、作者、卷等 漫画卷-id、标题、发行日期、封面id、isbn、页数等 这两个类继承自抽象类书。Book类将具有两个类的公共变量:id、title、releaseDate、coverID 我正在使用模式生成器创建漫画和体积对象。但当我试图设置描述时,我得到了以下错误: Manga manga = (Manga) new Manga.Builder().setID(id)
Manga manga = (Manga) new Manga.Builder().setID(id)
.setTitle(title)
.setCoverID(id)
.setDescription() //Cannot resolve method 'setDescription' in 'Builder'
.build();
图书类别:
公开摘要类目{
公共最终长id;
公共最终字符串标题;
受保护手册(最终生成器){
this.id=builder.id;
this.title=builder.title;
}
公共抽象静态类生成器{
私人长id;
私有字符串标题;
公共生成器集合id(长id){
this.id=id;
归还这个;
}
公共生成器集合标题(字符串标题){
this.title=标题;
归还这个;
}
公共抽象T build();
}
我的漫画课:
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);
}
}
公共类漫画书{
私有最终字符串描述;
受保护漫画(建设者){
超级建筑商;
this.description=builder.description;
}
公共静态类生成器扩展了Book.Builder{
私有字符串描述;
公共生成器集合描述(字符串描述){
this.description=描述;
归还这个;
}
@凌驾
公共漫画构建(){
返回新漫画(本);
}
}
还是有更好的解决方案
谢谢。这里应该有用:
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();
}
}
我已经实现了这个模式好几次了,Joshua Bloch在他的书《高效Java》(顺便说一句,很棒的书)中写到了这一点
如果你需要进一步的信息,请告诉我
顺便说一句:个人偏好-在构建器流上没有
set
的setter方法。看起来“更干净”:)“有两个实体”你需要书
基类吗?这就是我被告知要做的。所以一些抽象类(书)将包含两个类的公共变量。或者它是不必要的,因为它们只有4个公共变量?
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();