本文介紹了將類(lèi)作為參數(shù)傳遞給方法,然后調(diào)用靜態(tài)方法的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我有一個(gè)使用案例,其中一個(gè)類(lèi)存在于包的兩個(gè)版本中。
package packageV1;
public class MyClass extends BaseClass{
public static String example(){
return "Version1";
}
}
package packageV2;
public class MyClass extends BaseClass{
public static String example(){
return "Version2";
}
}
到目前為止(我相信)還不錯(cuò)。
然后,我有一個(gè)使用該類(lèi)的應(yīng)用程序,為了避免為不同的包版本重寫(xiě)應(yīng)用程序,我希望將應(yīng)該使用的類(lèi)(即,用于感興趣的包)作為參數(shù)傳遞給該應(yīng)用程序。
所以類(lèi)似于
public class Application{
private Class<BaseClass> selectedClass;
public void Application(Class<BaseClass> selectedClass){
this.selectedClass = selectedClass;
this.selectedClass.example(); // not possible
}
}
我相信如果我在構(gòu)造函數(shù)中傳遞MyClass
的實(shí)例,我可以調(diào)用this.selectedClass.example();
,但然后我會(huì)通過(guò)實(shí)例對(duì)象調(diào)用靜態(tài)方法,這不是很好嗎?
另一方面,在上面的示例中,selectedClass
是一個(gè)Class對(duì)象,所以我不能像上面那樣調(diào)用靜態(tài)方法example
。
這是否意味著我應(yīng)該使用反射?如selectedClass.getMethod(name, parameterTypes)
。
在我看來(lái)太復(fù)雜了。
還是有更好的設(shè)計(jì)?
推薦答案
@javadev是對(duì)的。使用反射幾乎總是一個(gè)非常糟糕的主意。這是一個(gè)過(guò)于復(fù)雜的問(wèn)題。
這里不需要反思。在實(shí)例上調(diào)用靜態(tài)方法的能力很快被意識(shí)到是一個(gè)設(shè)計(jì)錯(cuò)誤。以至于有了后續(xù)的高度非正交性設(shè)計(jì)選擇,因?yàn)樗贿m用于作為接口成員的靜態(tài)方法。
簡(jiǎn)單的解決方案是將靜態(tài)方法移動(dòng)到無(wú)狀態(tài)對(duì)象的實(shí)例方法。不需要Class
或其他反射。這是策略設(shè)計(jì)模式的應(yīng)用。
這篇關(guān)于將類(lèi)作為參數(shù)傳遞給方法,然后調(diào)用靜態(tài)方法的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,