gpt4 book ai didi

java - 使用父类的通用生成器创建子类

转载 作者:行者123 更新时间:2023-12-02 03:42:02 24 4
gpt4 key购买 nike

我正在探索使用生成器设计模式来创建父对象的子类,特别是基于子类的泛型类型。这句话有点令人困惑,我的意思是:

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;
}
}
}

但是,这最终会变得相当容易出错并且“hackish”。我希望能够有一个生成器来创建所有子类。

问题

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

注意:这个问题的真正需求并不像 Animal 类示例那么微不足道。您可以想象我正在尝试构建包含许多参数的父类的子类。使用构建器模式将使实例化变得更加容易,并且更容易为 future 的子类扩展。

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

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

最佳答案

我会让每个 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);
}
}
}

关于java - 使用父类的通用生成器创建子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36731268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com