2016-09-23 49 views
2

我希望重構看起來像這樣的Java代碼。 a,b,c和d是布爾標誌。基於幾個標誌的條件

if(a && b && c && d) doA(); 
else if (a && b && c && !d) doB(); 
else if (a && b && !c && d) doC(); 
else if (!a && !b && c && d) doD(); 

等等,全部16種組合。有沒有更好的辦法?我考慮了一個將值作爲方法參考的Map,但形成關鍵字仍然是一個謎。

+2

這很奇怪*反正*,但除了'a','b','c'和'd'之外的一些更實際的代碼將會朝着理想的解決方案邁出更長的一步。你也想告訴我們你有可能的組合和行動鏈。這可能會很長,但如果您正在尋找一個可靠的解決方案,我們的回答者必須對您的問題有一個深入的瞭解。 – Makoto

+0

如果沒有副作用,可以使用位掩碼。 – Andrey

+0

謝謝@Makoto,但組合如我所說:所有16種方式來組合4位。 0000,0001,0010,0011,0100,0101等,直到1111.沒有理由輸入全部內容。與每個組合相關的特定方法調用中會發生什麼情況,如果這就是您的「操作鏈」所代表的含義,則與問題無關。 – KevinRethwisch

回答

2

創建函數數組,

public class FunctionTypes { 
    public void func() {} 
} 

    ..... 

    FunctionTypes[] functions = new FunctionTypes[] { 
      new FunctionTypes() { 
       public void func() { f1(); } 

       public void f1() { 
        // handle case #1 
       } 
      }, 
      new FunctionTypes() { 
       public void func() { f2(); } 

       public void f2() { 
        // handle case #2 
       } 
      }, 
      new FunctionTypes() { 
       public void func() { f3(); } 

       public void f3() { 
        // handle case #3 
       } 
      }, 
      new FunctionTypes() { 
       public void func() { f4(); } 

       public void f4() { 
        // handle case #4 
       } 
      }, 
      .... 
     }; 

    // invoke case #0 
    functions[0].func(); 

    // invoke case #1 
    functions[1].func(); 

選擇索引,從A,B,C使用的比特,d

index = 0; 
    index |= a; 
    index |= b << 1; 
    index |= c << 2; 
    index |= d << 3; 

好像是它們計數所有16個病例。或者,您可以從主類繼承16個不同的子類,並覆蓋每個不同子類中的方法,並使用頂級類數組選擇這些類的實例。也許實現一個接口可能會更好。

我不知道java的map是否有訪問時間O(n * logn),但是數組訪問是O(1)。