有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用父类的泛型生成器创建子类

我正在探索使用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;
        }
    }
}

除此之外,这最终是相当容易出错和“黑客”。我希望能够有一个生成器来创建所有子类

问题

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

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

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

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


共 (1) 个答案

  1. # 1 楼答案

    与用户指定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);
        }
      }
    }