2014-03-04 153 views
2

現在我有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; 
} 

因爲以後有類的可能性,我想使類初始化和方法調用通用。請讓我知道實現它的最佳方式。在此先感謝您的建議。

+2

調查*工廠模式*。 –

回答

3

我覺得這是做(沒有泛型)有道:

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(); 

}

編輯:

而不是使用開關狀態NT你可以添加到您的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(); 
+0

在getInstance(){}方法中,我需要再次放置一些switch case或if block來決定要初始化哪個類並返回? – Sunil

+0

@ user1849139:創建ICommon的具體實例的邏輯當然取決於您的需求 – Daniel

+0

@ user1849139:我更新了我的答案,檢查它。 – Daniel

0

@ user1849139

1)public interface genaricInter face public void commonMethod();上述接口 }

2)實現到您的類並覆蓋方法

3)公共類class1實現genaricInterface { 公共無效的commonMethod(){// 這裏寫邏輯類class1 } }

4)像上面的類可以將該

5後執行到的在Java類正數)創建像genaricInterface GI =新的Class1實例();

6)調用方法gi.commonMethod();