2016-02-09 22 views
4

這是我不能左右我的頭,現在我有這樣的事情:基於一個整數值,用不同的方法

boolean method1(int a){ 
//something 
returns true; 
} 

boolean method2(int a){ 
//something 
returns true; 
} 

for (int i; i<100; i++){ 
    switch (someInt){ 
    case 1: boolean x = method1(i); 
    case 2: boolean x = method2(i); 
    } 


} 

我想什麼是採取轉出循環,如該someInt將保持不變,爲每一個我,所以需要進行一次決定,但我需要爲每一個我要檢查X,所以我會需要這樣的東西:

switch (someInt){ 
      case 1: method1(); //will be used in loop below 
      case 2: method2(); //will be used in loop below 
      } 

    for (int i; i<100; i++){ 
     boolean x = method the switch above picked 
    } 
+0

查找策略模式。基本上,你要編寫的代碼不是很乾淨/我不認爲這是可能的,沒有反思 –

+3

你可以使用Java 8方法引用:https://blog.idrsolutions.com/2015/02/java- 8-method-references-explained-5-minutes/ –

+2

原始版本不錯。其他解決方案實際上都是僞裝的「開關」,並且它們的性能更差:) – ZhongYu

回答

7

您可以使用Java 8的方法引用。

下面是一個例子:

public class WithMethodRefs { 
    interface MyReference { 
     boolean method(int a); 
    } 

    boolean method1(int a) { 
     return true; 
    } 

    boolean method2(int a) { 
     return false; 
    } 

    public void doIt(int someInt) { 
     MyReference p = null; 
     switch (someInt) { 
     case 1: 
      p = this::method1; 
      break; 
     case 2: 
      p = this::method2; 
      break; 
     } 

     for (int i = 0; i < 100; i++) { 
      p.method(i); 
     } 
    } 
} 
+0

您也可以使用['java.util.function.IntConsumer'](http://docs.oracle.com/javase/8/docs/api/java/util/function/IntConsumer.html)而不是定義您自己的功能界面。 –

+2

這個開關語句被打破了,沒有中斷 –

+0

@DmitryP。謝謝!增加了缺少的'break'。 @MarkRotteveel我爲演示目的定義了我自己的界面。 'methodX'方法的簽名將來可能會改變。 –

5

您可以取代你的條件與多態性:

個一些例子:

與您的代碼示例:

interface CallIt { 
     boolean callMe(int a); 
    } 

    class Method1 implements CallIt { 
     public boolean callMe(int a) { 
      return true; 
     } 
    } 

    class Method2 implements CallIt { 
     public boolean callMe(int a) { 
      return true; 
     } 
    } 

    void doIt(int someInt) { 
     CallIt callIt = null; 
     switch (someInt) { 
     case 1: 
      callIt = new Method1(); 
      break; 
     case 2: 
      callIt = new Method2(); 
      break; 
     } 

     for (int i = 0; i < 100; i++) { 
      boolean x = callIt.callMe(i); 
     } 
    } 
+1

在某些情況下不能使用多態性,但我肯定會考慮這一點。所以+1。 –

+0

儘管方法引用正是OP所要求的,但這個解決方案非常值得考慮,因爲它使用了面向對象的設計實踐。 – Ciara

4

我的兩分錢。如果我們開始發揮功能,那就直到最後!

IntFunction<IntFunction<Boolean>> basic = x -> i -> { 
     switch (x) { 
      case 1: return method1(i); 
      case 2: return method2(i); 
      default: 
       throw new RuntimeException("No method for " + someInt); 
     } 
    }; 
    IntFunction<Boolean> f = basic.apply(someInt); 
    IntStream.range(0, 100).forEach(i -> { 
     boolean result = f.apply(i); 
     //do something with the result 
    }); 

此外,我沒有看到您的交換機中的任何斷言。也許是因爲這只是一個例子,但請檢查他們是否在這裏。否則,您將爲所有情況獲取method2()。

相關問題