我有一些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/