Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当多个类继承单个抽象类时使用生成器模式_Java_Abstract Class_Builder - Fatal编程技术网

Java 当多个类继承单个抽象类时使用生成器模式

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)

我正在使用两个实体构建web应用程序:

  • 漫画id、标题、发行日期、封面id、流派、作者、卷等
  • 漫画卷-id、标题、发行日期、封面id、isbn、页数等
  • 这两个类继承自抽象类书。Book类将具有两个类的公共变量:id、title、releaseDate、coverID

    我正在使用模式生成器创建漫画和体积对象。但当我试图设置描述时,我得到了以下错误:

            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();