使用父类的通用 Builder 创建子类
Create subclass using parent's generic Builder
我正在探索使用 Builder 设计模式创建父对象的子classes,特别是基于子class 的通用类型。这句话有点令人费解,我的意思是:
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"。我希望能够有一个生成器来创建所有子 classes。
问题
有更好的方法吗?也许 Builder 设计模式不适合我的需要。这有效,但感觉不对。
注意:这个问题的真正需求并不像 Animal class 示例那样微不足道。你可以想象我正在尝试构建一个子 class 到包含许多参数的父 class。使用构建器模式将使它更容易实例化,并且更容易为将来的子classes 扩展。
subclassed 对象将只有自己的方法。没有额外的字段,只有严格定义为 subclass 类型的方法。
即鸭子是鸟的子class,它会嘎嘎叫。鸸鹋是鸟的亚种class,但我不希望它叫,它只会运行。但是我都希望他们有名字和性别。
而不是用户指定 Animal class,我会让每个 Animal subclass 有自己的 Builder 来构建那个 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);
}
}
}
我正在探索使用 Builder 设计模式创建父对象的子classes,特别是基于子class 的通用类型。这句话有点令人费解,我的意思是:
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"。我希望能够有一个生成器来创建所有子 classes。
问题
有更好的方法吗?也许 Builder 设计模式不适合我的需要。这有效,但感觉不对。
注意:这个问题的真正需求并不像 Animal class 示例那样微不足道。你可以想象我正在尝试构建一个子 class 到包含许多参数的父 class。使用构建器模式将使它更容易实例化,并且更容易为将来的子classes 扩展。
subclassed 对象将只有自己的方法。没有额外的字段,只有严格定义为 subclass 类型的方法。
即鸭子是鸟的子class,它会嘎嘎叫。鸸鹋是鸟的亚种class,但我不希望它叫,它只会运行。但是我都希望他们有名字和性别。
而不是用户指定 Animal class,我会让每个 Animal subclass 有自己的 Builder 来构建那个 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);
}
}
}