2012-11-15 42 views
1

我得到一個應用程序,它應該根據參數的輸入調用不同的方法。我的想法直到現在基本上是,我創建了一個Switch,並根據它的情況分別調用這些方法。例如:通過參數調用不同的方法

switch (methodName) 
{ 
    case "method1": 
     method1(); 
     break; 
    case "method2": 
     method2(); 
     break; 
    default: 
     System.out.println(methodName + " is not a valid method!"); 
} 

我正在考慮的選項,通過其給定的字符串調用該方法,因爲在這個問題上提供:

How do I invoke a Java method when given the method name as a string?

但後來我從答案的一個閱讀,它的不安全。你們有什麼感想?

+3

您應該使用繼承或組合。 –

+1

看看這個(類似)的問題:http://stackoverflow.com/questions/4480334/how-to-call-a-method-stored-in-a-hashmap-java – aioobe

+0

謝謝你們,我wasn'確定我需要搜索什麼(因此我無法找到好的結果來解決我的問題)。我想,你可能已經關閉了我的問題,非常感謝:) –

回答

1

如果您需要從字符串轉到方法調用,反射可能是您的最佳選擇。沒有涉及到很大的安全問題,特別是如果您限制允許調用的一組方法。使用Map<String, Method>是實現它的一種方式,具有改進性能的好處,因爲主要瓶頸不是反射方法調用,而是方法查找。

沒有反思,你可以通過Map<String, Callable>來實現這個目標,其中你實現了Callable以及每個方法調用的匿名類實例。更多的樣板代碼,但「類型安全」。

+0

太棒了! MethodCall應該如何? 'Main.class.getMethod(命令).invoke(空)'? –

+0

如果'command'是一個靜態方法,就是這樣。否則,而不是'null'使用你想要調用該方法的實例。不過,不要在異常處理上行:'try {... reflection ...} catch(RuntimeException e){throw e; } catch(Exception e){拋出新的RuntimeException(e); }'。 –

+0

雖然我遇到了麻煩,但它指向了正確的方向。標記爲最佳答案! –

0

通過使用Command設計模式,可以實現與反射相同的功能。它將動作封裝到對象中,因此可以使用通用接口查找和調用它們。

更多此處閱讀:http://en.wikipedia.org/wiki/Command_pattern

+0

+1這個很酷的建議! –

相關問題