现在我有 4 个类,根据下面示例中给出的情况,它们具有要调用的通用方法。
Class1 class1 = new Class1();
Class1 class2 = new Class2();
Class1 class3 = new Class3();
Class1 class4 = new Class4();
MyEnum enum = MyEnum.valueOf(getString()); //getString() will return String "c1" or "c2" or ....
switch(s)
{
case c1 :
class1.add();
break;
case c2 :
class2.add();
break;
case c3 :
class3.add();
break;
case c4 :
class4.add();
break;
}
由于以后有可能出现新类,所以我想让类初始化和方法调用通用。请让我知道实现它的最佳方法。预先感谢您的建议。
最佳答案
我认为这是一个正确的方法(没有泛型):
public interface ICommon {
public void add();
}
那么Class1,Class2,Class3
,...应该实现ICommon
接口(interface)。
因此,我建议您创建一个像这样的 ClassFactory:
public class ClassFactory {
public static ICommon getInstance() {
... //do here whatever it takes to create a concrete instance of ICommon
}
最后,它看起来像这样:
ICommon someClass = ClassFactory.getInstance();
someClass.add();
}
编辑:
您可以将其添加到您的ClassFactory
中,而不是使用switch语句:
public class ClassFactory {
private static HashMap<String, String> mClassMapping = new HashMap<String, String>();
public static void registerClass(Class<?> clazz, String tag) {
String name = clazz.getName();
mClassMapping.put(tag, name);
}
public static ICommon getInstance(String tag) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
String className = mClassMapping.get(tag);
if (null == className) {
throw new ClassNotFoundException(String.format("There is no class registered for tag: %s", tag));
}
Class<?> aClass = Class.forName(className);
return (ICommon)aClass.newInstance();
}
}
最后你可以这样做: 在某个起点注册您的类(class):
ClassFactory.registerClass(Class1.class, "c1");
ClassFactory.registerClass(Class2.class, "c2");
...
然后获取一个像这样的实例:
String tag = ...//get tag associated to the class somehow;
ICommon classInstance = ClassFactory.getInstance(tag); //i.e tag == "c1"
classInstance.add();
关于java - 如何实例化泛型类并调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22163978/