2013-11-02 92 views
0

我知道如何使用HashMaps和東西來將鍵映射到值。我只是想知道你是否可以將鍵映射到方法。將鍵映射到Java中的方法

例如,程序詢問用戶輸入。然後它調用一個名稱爲輸入輸入的方法。即:如果輸入是"cat",則調用方法cat()

顯然可以使用if語句,但有沒有更簡單的方法?

+0

另一件事:當我鍵入Java代碼時,如何使它以代碼格式顯示? – FlameKnight123

+0

@ FlameKnight123如何讓它以代碼格式顯示?在Eclipse或Netbeans等IDE中輸入。或者當你問一個問題時是什麼意思?在這種情況下,或者用'(這將把它放在**一行**上)包圍代碼或者在代碼前放四個空格(詳情請參閱http://stackoverflow.com/help/formatting) – Justin

+0

明白了...謝謝大家的幫助! – FlameKnight123

回答

-1

你可以做字符串到Method

例如,在你的情況,你可以這樣做:

String k = "cat" 

String caller(String key) 
{ 
    String ret = null; 
    if (key.equals(k)) 
    { 
    ret = cat(); 
    } 
    return ret; 
} 

String cat() {} 

所以每次你傳遞一個用戶的輸入caller()功能時,方法cat()被調用。

+0

對不起,我不明白你的意思。 – FlameKnight123

+0

OP已經明確表示他想避免使用一堆'if'來在要調用的方法之間切換。 –

2

取出方法並調用它。

java.lang.reflect.Method method = class_obj.getClass().getMethod("functionName"); // add params if any 
method.invoke(); // add params if any 

,當你有沒有傳遞參數這相當於在調用函數

functionName(void); 

這是這種情況。

1

您可以創建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 
} 

herehere

現在你有方法的名稱的方法,那麼你可以調用的Map - 雖然你需要使用Method API來調用它們。

+0

又是什麼? – FlameKnight123

+0

編譯器說你的for語句不是一個聲明。 – FlameKnight123

+0

忘記'm'的類型聲明。你不能添加那個?真?哈哈 – Vidya

1
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()"); 
    } 
} 
1

而不是試圖調用特定方法(它不是一個面向對象的方法),應創建一個方法的接口(或使用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

1

您可以使用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); 
     } 

    } 
} 

這將輸出:

喵!

樹皮!

無法用名稱調用方法:倉鼠

唧唧!