[英]How to instantiate generic class and call a method
現在,我有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
接口。
因此,我建議您創建一個像這樣的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();
}
編輯:
除了使用switch語句,您還可以將其添加到ClassFactory
:
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();
}
}
最后,您可以執行以下操作:在某個起點注冊您的課程:
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();
@ user1849139
1)公共接口genaricInterface {public void commonMethod(); }
2)在類的上面實現接口並重寫方法
3)public Class class1實現genaricInterface {public void commonMethod(){//在此處為class1編寫邏輯}}
4)就像上面的類一樣,之后可以在Java中實現n個類
5)創建實例,如genaricInterface gi = new class1();
6)調用方法gi.commonMethod();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.