2014-09-11 91 views
0

假設我有一個方法,其中包含3個其他方法的調用。我如何設置內部方法的調用順序取決於參數?例如,方法調用順序

public void method(int i){ 
    if(i == 0){ 
     anotherMethod1(); 
     anotherMethod2();   
     anotherMethod3(); 
    } else if(i == 1){ 
     anotherMethod2(); 
     anotherMethod1();   
     anotherMethod3(); 
    } else if(i == 2){ 
     anotherMethod3(); 
     anotherMethod2();   
     anotherMethod1(); 
    } 

    //ETC 

有沒有辦法做到這一點,沒有多個if-else子句?

+7

看起來像一個糟糕的設計模式。 – hsz 2014-09-11 10:33:07

+0

爲什麼你的方法調用順序會改變你的程序行爲?這對我來說是一個「糟糕的設計」鈴 – Narmer 2014-09-11 10:34:20

+0

@hsz你在說什麼? – 2014-09-11 10:34:24

回答

1

你說過你在使用Java 5(!),所以Java 8的lambda表達式已經出來。

你幾乎有三種選擇:

  1. if/else if/else if在你的榜樣。

  2. switch,這與之相似。

  3. A Map(或數組)的接口引用數組,其中您通過調用每個方法來實現接口。外部的Map /數組就是你用參數索引的數組,它所包含的數組是按照你想要調用它們的順序調用的方法。例如,一個調度映射,它以正確的順序給你提供一個列表,包裝在一個接口中,以便存儲對它們的引用。

  4. #3,但是使用反射代替,所以內部數組是Method的數組。

#3,#4是在上面幾乎可以肯定方式

+0

是的,我在想像#3。我曾經假設,除了這三個方法之外,還必須有更多的參數。否則,OP沒有理由不喜歡使用'if/else'。 – 2014-09-11 11:22:11

1

假設你只是想這樣做對3種方法,你可以做這樣的事情:

int[][] orderOfExecution = {{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,2,1},{3,1,2}}; 

void executeMethod(int x){ 
    switch(x){ 
     case 1: anotherMethod1(); break; 
     case 2: anotherMethod2(); break; 
     case 3: anotherMethod3(); break; 
    } 
} 

和你method()方法應該是這個樣子:

void method(int x){ 
    for(int i : orderOfExecution[x]) 
     executeMethod(i); 
} 

現在這個億韓元如果你想爲更多的方法做它,但如果你想這樣做,你可以創建一個方法返回所有可能的大小爲n的數組,其中n是方法的數量你想以這種方式執行。

希望這會有所幫助。

+0

現在,這是處理我的#3 /#4場景的好方法,特別是對於Java 5 +1! – 2014-09-11 11:29:29

+0

哦謝謝你:) – qbit 2014-09-11 17:04:58