超类中的java静态工厂
我有一些java bean(它们有超类中的java静态工厂,java,factory,Java,Factory,我有一些java bean(它们有private属性和getter/setter方法)。并且可以在构造函数中使用映射构建实例,如下所示: public class A { private String name; private String gender; ... public A(Map<String, Object> m){ BeanInfo beanInfo = Introspector.getBeanInfo(this.ge
private
属性和getter/setter
方法)。并且可以在构造函数中使用映射构建实例,如下所示:
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()
...
}
我觉得这很烦人,我想在父类a
中构建一个静态工厂方法来一次性完成这项工作(可能在类a
?)中有类似的代码):
publicstaticfrommap(Map){
returnnew//我真的不知道怎么写这个。
}
有人能给我一个关于如何编写这个工厂方法的提示吗?还是有可能?也许是一些通用的技巧?您想要使用的方法不是最好的。事实上,如果将工厂方法放在超类中,那么它必须知道哪些是它的子类。因此,这种方法打破了抽象原则。例如,如果您赋予基类构建其子类的责任,那么每次添加新的子类型时都必须对其进行更改。此外,这违反了单一责任原则
可以使用工厂方法,但必须将其提取并放入专用类
必须在子类内部调用超类的构造函数,才能保证子类是超类的精化
最后,为了降低层次结构中类之间的耦合级别,我建议您仅使用抽象类型的继承,例如abstract
类或interface
s。您想要使用的方法不是最好的方法。事实上,如果将工厂方法放在超类中,那么它必须知道哪些是它的子类。因此,这种方法打破了抽象原则。例如,如果您赋予基类构建其子类的责任,那么每次添加新的子类型时都必须对其进行更改。此外,这违反了单一责任原则
可以使用工厂方法,但必须将其提取并放入专用类
必须在子类内部调用超类的构造函数,才能保证子类是超类的精化
最后,为了降低层次结构中类之间的耦合级别,我建议您仅使用抽象类型的继承,例如abstract
类或interface
s。您想要使用的方法不是最好的方法。事实上,如果将工厂方法放在超类中,那么它必须知道哪些是它的子类。因此,这种方法打破了抽象原则。例如,如果您赋予基类构建其子类的责任,那么每次添加新的子类型时都必须对其进行更改。此外,这违反了单一责任原则
可以使用工厂方法,但必须将其提取并放入专用类
必须在子类内部调用超类的构造函数,才能保证子类是超类的精化
最后,为了降低层次结构中类之间的耦合级别,我建议您仅使用抽象类型的继承,例如abstract
类或interface
s。您想要使用的方法不是最好的方法。事实上,如果将工厂方法放在超类中,那么它必须知道哪些是它的子类。因此,这种方法打破了抽象原则。例如,如果您赋予基类构建其子类的责任,那么每次添加新的子类型时都必须对其进行更改。此外,这违反了单一责任原则
可以使用工厂方法,但必须将其提取并放入专用类
必须在子类内部调用超类的构造函数,才能保证子类是超类的精化
最后,为了降低层次结构中类之间的耦合级别,我建议您仅使用抽象类型的继承,例如abstract
classes或interface
s.来回答您的问题,并在映射的“class”条目中假设完全限定的类名:
public static Object fromMap(Map<String, Object> map) throes Exception
return Class.forName((String)map.get("class")).getConstructor(Map.class).newInstance(map);
}
publicstaticobjectfrommap(Map-Map)thres异常
返回Class.forName((字符串)map.get(“Class”)).getConstructor(map.Class).newInstance(map);
}
要回答您的问题,并假设地图的“class”条目中有完全限定的类名:
public static Object fromMap(Map<String, Object> map) throes Exception
return Class.forName((String)map.get("class")).getConstructor(Map.class).newInstance(map);
}
publicstaticobjectfrommap(Map-Map)thres异常
返回Class.forName((字符串)map.get(“Class”)).getConstructor(map.Class).newInstance(map);
}
要回答您的问题,并假设地图的“class”条目中有完全限定的类名:
public static Object fromMap(Map<String, Object> map) throes Exception
return Class.forName((String)map.get("class")).getConstructor(Map.class).newInstance(map);
}
publicstaticobjectfrommap(Map-Map)thres异常
返回Class.forName((字符串)map.get(“Class”)).getConstructor(map.Class).newInstance(map);
}
要回答您的问题,并假设地图的“class”条目中有完全限定的类名:
public static Object fromMap(Map<String, Object> map) throes Exception
return Class.forName((String)map.get("class")).getConstructor(Map.class).newInstance(map);
}
publicstaticobjectfrommap(Map-Map)thres异常
返回Class.forName((字符串)map.get(“Class”)).getConstructor(map.Class).newInstance(map);
}
我更喜欢使用帮助器类,类似于以下内容:
package empty;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class FromMap {
public static class First {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override public String toString() {
return "First [name=" + name + ", age=" + age + "]";
}
}
public static void main(String[] args) {
Map<String, Object> v = new HashMap<String, Object>();
v.put("name", "My Name");
v.put("age", 100);
try {
First f = FromMap.fromMap(v, new First());
System.out.println(f);
} catch (Exception e) {
e.printStackTrace();
}
}
public static <T> T fromMap(Map<String, Object> m, T t) throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException, IntrospectionException {
BeanInfo beanInfo = Introspector.getBeanInfo(t.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(t, m.get(pd.getName()));
}
}
return t;
}
}
包为空;
导入java.beans.BeanInfo;
导入java.beans.IntrospectionException;
导入java.beans.Introspector;
导入java.beans.PropertyDescriptor;
导入java.lang.reflect.InvocationTargetException;
导入java.lang.reflect.Method;
导入java.util.HashMap;
导入java.util.Map;
公共类FromMap{
公共静态类优先{
私有字符串名称;
私人互联网;
公共字符串getName
public class Animal<A extends Animal> {
public A init(Map<String, Object> map) {
...
}
}
public class Dog extends Animal<Dog> {
public void bark() { ... }
}
static void test {
new Dog().init(map).bark();
}
public class Animal {
public static class Factory {
public static <A extends Animal> A create(Class<A> animalClass, Map<String, Object> map) {
try {
A a = animalClass.newInstance();
a.init(map);
return a;
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
return null;
}
}
void init(Map<String, Object> map) {
// ...
}
}
public class Dog extends Animal {
public void bark() { ... }
}
static void test() {
Animal.Factory.create(Dog.class, map).bark();
}