Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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 使用parent'创建子类;s通用生成器_Java_Generics_Inheritance_Builder - Fatal编程技术网

Java 使用parent'创建子类;s通用生成器

Java 使用parent'创建子类;s通用生成器,java,generics,inheritance,builder,Java,Generics,Inheritance,Builder,我正在探索使用Builder设计模式创建父对象的子类,具体基于子类的泛型类型。这句话有点让人困惑,我的意思是: public class Animal(){ private String name; private String gender; public Animal(Builder<?> builder){ this.name = builder.name; this.gender = builder.gender;

我正在探索使用Builder设计模式创建父对象的子类,具体基于子类的泛型类型。这句话有点让人困惑,我的意思是:

public class Animal(){
    private String name;
    private String gender;

    public Animal(Builder<?> builder){
        this.name = builder.name;
        this.gender = builder.gender;
    }

    public static Builder<T extends Animal>{
        private String name;
        private String gender;

        public Builder<T> setName(String name){
            this.name = name;
            return this;
        } 

        public Builder<T> setGender(String gender){
            this.gender = gender;
            return this;
        }        

        public T build(Class<T> clazz){
            try {
                Constructor<T> c = clazz.getDeclaredConstructor(Builder.class);
                c.setAccessible(true);
                return c.newInstance(this);
            }catch (Exception e){
                e.printStackTrace();
            }

            return null;
        }
    }
}
公共类动物(){
私有字符串名称;
私人字符串性别;
公共动物(建筑商){
this.name=builder.name;
this.gender=builder.gender;
}
公共静态生成器{
私有字符串名称;
私人字符串性别;
公共生成器集合名(字符串名){
this.name=名称;
归还这个;
} 
公共生成器设置性别(字符串性别){
这个。性别=性别;
归还这个;
}        
公共T构建(类clazz){
试一试{
构造函数c=clazz.getDeclaredConstructor(Builder.class);
c、 setAccessible(true);
返回c.newInstance(this);
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
}
}
除此之外,这最终是相当容易出错和“黑客”。我希望能够有一个生成器来创建所有子类

问题

有更好的方法吗?也许Builder设计模式不适合我的需要。这是可行的,但感觉不对

注意:这个问题的真正需要并不像动物类的例子那么简单。您可以想象我正在尝试为包含许多参数的父类构建一个子类。使用构建器模式将使它更容易实例化,并且更容易为将来的子类扩展

子类对象将只具有自己的方法。没有额外的字段,只有严格定义为其子类类型的方法


也就是说,鸭子是鸟的一个亚类,它会嘎嘎叫。鸸鹋是鸟的一个子类,但我不想让它嘎嘎叫,它只会跑。但是我都希望它们有一个名称和性别。

我希望每个动物子类都有自己的构建器,可以构建该动物,而不是由用户指定动物类

即:

public abstract class Animal {
  protected Animal(Builder<?> builder) { ... }

  public abstract static class Builder<T extends Animal> {
    // setters for fields common to all animals go here

    public abstract T build();
  }
}

public final class Dog extends Animal {
  private Dog(Builder builder) {
    super(builder);
  }

  public static final class Builder extends Animal.Builder<Dog> {
    @Override
    public Dog build() {
      return new Dog(this);
    }
  }
}
公共抽象类动物{
受保护动物(建筑商){…}
公共抽象静态类生成器{
//所有动物共有的领域的设定者都在这里
公共抽象T build();
}
}
公共末级犬类动物{
私家狗(建筑商){
超级建筑商;
}
公共静态最终类生成器扩展了Animal.Builder{
@凌驾
公犬体型(){
归还新狗(本);
}
}
}

与用户指定Animal类不同,我希望每个Animal子类都有自己的构建器,可以构建该动物

即:

public abstract class Animal {
  protected Animal(Builder<?> builder) { ... }

  public abstract static class Builder<T extends Animal> {
    // setters for fields common to all animals go here

    public abstract T build();
  }
}

public final class Dog extends Animal {
  private Dog(Builder builder) {
    super(builder);
  }

  public static final class Builder extends Animal.Builder<Dog> {
    @Override
    public Dog build() {
      return new Dog(this);
    }
  }
}
公共抽象类动物{
受保护动物(建筑商){…}
公共抽象静态类生成器{
//所有动物共有的领域的设定者都在这里
公共抽象T build();
}
}
公共末级犬类动物{
私家狗(建筑商){
超级建筑商;
}
公共静态最终类生成器扩展了Animal.Builder{
@凌驾
公犬体型(){
归还新狗(本);
}
}
}

在阅读您的答案之前,我刚刚尝试过这一点。我最喜欢它,所以这是我在阅读你的答案之前刚刚尝试过的东西。我最喜欢它,因为有人对我为什么在这里发布这篇文章发表了评论,而不是在代码审查中。原因是因为这是一个真正的问题。。。我确实提供了我尝试过的代码,但我知道这不是一个干净的Java解决方案。我希望有人能帮助我得到一个更好的答案,用我的示例代码作为一个起点来构建并展示给我。有人就我为什么在这里发布这篇文章发表了评论,而不是在代码评论中。原因是因为这是一个真正的问题。。。我确实提供了我尝试过的代码,但我知道这不是一个干净的Java解决方案。我希望有人能帮助我得到一个更好的答案,使用我的示例代码作为一个起点来构建并向我展示。