我知道如何使用HashMaps
和東西來將鍵映射到值。我只是想知道你是否可以將鍵映射到方法。將鍵映射到Java中的方法
例如,程序詢問用戶輸入。然後它調用一個名稱爲輸入輸入的方法。即:如果輸入是"cat"
,則調用方法cat()
。
顯然可以使用if語句,但有沒有更簡單的方法?
我知道如何使用HashMaps
和東西來將鍵映射到值。我只是想知道你是否可以將鍵映射到方法。將鍵映射到Java中的方法
例如,程序詢問用戶輸入。然後它調用一個名稱爲輸入輸入的方法。即:如果輸入是"cat"
,則調用方法cat()
。
顯然可以使用if語句,但有沒有更簡單的方法?
你可以做字符串到Method
。
例如,在你的情況,你可以這樣做:
String k = "cat"
String caller(String key)
{
String ret = null;
if (key.equals(k))
{
ret = cat();
}
return ret;
}
String cat() {}
所以每次你傳遞一個用戶的輸入caller()
功能時,方法cat()
被調用。
對不起,我不明白你的意思。 – FlameKnight123
OP已經明確表示他想避免使用一堆'if'來在要調用的方法之間切換。 –
取出方法並調用它。
java.lang.reflect.Method method = class_obj.getClass().getMethod("functionName"); // add params if any
method.invoke(); // add params if any
,當你有沒有傳遞參數這相當於在調用函數
functionName(void);
這是這種情況。
您可以創建Map
幾乎任何東西。雖然你的場景當然是非正統的應用程序。
但如果你堅持,你可以這樣做:
Map<String, Method> map = new HashMap<>(); //Java 7
Method[] methods = ClassToMap.class.getDeclaredMethods() //First link
for(Method m : methods) {
map.put(m.getName(), m); //Second link
}
現在你有方法的名稱的方法,那麼你可以調用的Map
- 雖然你需要使用Method
API來調用它們。
public class Test {
public static void main(String[] args) throws Exception {
String name = args[0];
Method method = Test.class.getDeclaredMethod(name, new Class[]{});
method.invoke(null, new Object[]{});
}
public static void method1() {
System.out.println("in method1()");
}
public static void method2() {
System.out.println("in method2()");
}
}
而不是試圖調用特定方法(它不是一個面向對象的方法),應創建一個方法的接口(或使用Runnable
)並實現每一個可調用方法在一個單獨的類。然後把這些類的實例到地圖並調用執行方法的匹配對象:
Map<String, Runnable> myMap = new HashMap<String, Runnable>();
// fill myMap with your objects
String input = ...; // get user input
if (myMap.containsKey(input)) {
myMap.get(input).run();
}
此外,請參閱strategy design pattern。
您可以使用Java Reflection API來做到這一點。這是一個基本的例子,但在實踐中,你應該讓你的異常捕獲邏輯更先進:
public class JavaDynamicMethodsExample {
public void cat() {
System.out.println("Meow!");
}
public void dog() {
System.out.println("Bark!");
}
public void bird() {
System.out.println("Chirp!");
}
public void callMethod(String methodName) {
try {
Method method = this.getClass().getMethod(methodName);
method.invoke(this);
} catch (Exception e) {
System.out.println("Could not call method with name: " + methodName);
}
}
public static void main(String [] args) {
JavaDynamicMethodsExample example = new JavaDynamicMethodsExample();
String [] methods = {"cat", "dog", "hamster", "bird"};
for(String methodName : methods) {
example.callMethod(methodName);
}
}
}
這將輸出:
喵!
樹皮!
無法用名稱調用方法:倉鼠
唧唧!
另一件事:當我鍵入Java代碼時,如何使它以代碼格式顯示? – FlameKnight123
@ FlameKnight123如何讓它以代碼格式顯示?在Eclipse或Netbeans等IDE中輸入。或者當你問一個問題時是什麼意思?在這種情況下,或者用'(這將把它放在**一行**上)包圍代碼或者在代碼前放四個空格(詳情請參閱http://stackoverflow.com/help/formatting) – Justin
明白了...謝謝大家的幫助! – FlameKnight123