gpt4 book ai didi

父类(super class)中的java静态工厂

转载 作者:行者123 更新时间:2023-12-02 04:33:30 27 4
gpt4 key购买 nike

我有一些java beans(它们有private属性和getter/setter方法)。并且可以使用 Map<String, Object> 构建实例在构造函数中像这样:

public class A {
private String name;
private String gender;
...

public A(Map<String, Object> m){
BeanInfo beanInfo = Introspector.getBeanInfo(this.getClass());
for(PropertyDescriptor pd: beanInfo.getPropertyDescriptors()){
if(pd.getName().equals("class")){
continue;
}
Method setter = pd.getWriteMethod();
if(setter != null && m.get(pd.getName())!=null){
setter.invoke(this,m.get(pd.getName()));
}
}
}
getter()/setter()
...

}

但是当有一些 child 的类(class)延长类(class)时A ,每次写一个新的子类时都应该有一个对应的构造函数:

public class B extends A {
public B(Map<String, Object> m){
super(m);
}
}

我觉得这很烦人,我想在父类中构建一个静态工厂方法 A一次性执行此操作(也许类 A 中有类似这样的代码?):

  public static fromMap(Map<String, Object>){
return new // I really don't have a clue how to write this.
}

有人可以给我一个关于如何编写这个工厂方法的提示吗?或者说这可能吗?也许有一些通用的技巧?

最佳答案

您想要使用的方法不是最好的方法。事实上,如果你将工厂方法放在父类(super class)中,那么它必须知道哪些是它的子类。因此,这种方法打破了抽象原则。例如,如果您赋予基类构建其子类的责任,则每次添加新子类型时都必须更改它。而且,这违反了单一责任原则

您可以使用工厂方法,但您必须将其提取出来并放入专用的类中。

必须在子类中调用父类(super class)的构造函数,这保证了子类是父类(super class)的改进。

最后,为了降低层次结构中的类之间的耦合度,我建议您仅使用抽象类型的继承,例如abstract类或接口(interface)s.

关于父类(super class)中的java静态工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31135900/

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