2013-12-21 94 views
4

我想使用switch语句,但是我无法在没有重复代码或使用随附的if语句的情况下构造它。有没有解决的办法?在switch语句(Java)中重用代码

我有5个案例,除了其中一个之外,我想执行某些操作。所以用switch声明,我可以这样做:

switch(x) { 
case A: 
    foo(); 
    break; 
case B: 
case C: 
case D: 
case E: 
    bar(); 
    break; 
} 

简单。但困难在于我还需要针对每一个执行另一个独特的操作,所以我不能使用案例的fall-through功能。所以我减少要么

switch(x) { 
case A: 
    foo(); 
    baz(0); 
    break; 
case B: 
    bar(); 
    baz(1); 
    break; 
case C: 
    bar(); 
    baz(2); 
    break; 
case D: 
    bar(); 
    baz(3); 
    break; 
case E: 
    bar(); 
    baz(4); 
    break; 
} 

这气味我,因为不必每次都要重复bar()的,或

switch(x) { 
case A: 
    baz(0); 
    break; 
case B: 
    baz(1); 
    break; 
case C: 
    baz(2); 
    break; 
case D: 
    baz(3); 
    break; 
case E: 
    baz(4); 
    break; 
} 
if (x != A) { bar(); } 

不复制任何代码,但它困扰我,有我需要同时使用switchif

我想另外一个替代方法是使用地图,像

Map<X, Integer> m = new HashMap<X, Integer>(); 
m.put(A, 0); 
m.put(B, 1); 
m.put(C, 2); 
m.put(D, 3); 
m.put(E, 4); 

if (m.get(x) == 0) { 
    foo(); 
} else { 
    bar(); 
} 
baz(m.get(x)); 

但现在我已经介绍了整个数据结构只是清理它。 (当你计算地图的初始化时,它甚至没有那么干净。)

任何提示?

+0

你不能/不想加上'如果(ARG == 0)条();''来baz'? –

+0

我想我可以,但我希望它更一般......事实上,在我的代码中,它甚至不是'bar()',它只是一个赋值语句。 –

回答

10

x任何机会枚举?在这种情况下,只需将该方法移至枚举而不是切换。

enum Employee { 
    SENIOR { 
     @Override 
     public int salary() { 
      return 60; 
     } 
    }, 
    JUNIOR { 
     @Override 
     public int salary() { 
      return 40; 
     } 
    }; 

    public abstract int salary(); 
} 

,并呼吁

employee.salary(); 

比切换好得多。

是的;你将不得不重复方法调用,但我认为这是正确和明确的。或者...在你的枚举中使用一个构造函数。请原谅“雇员”代码与“foobar”代码的混合。

private final boolean flag; 
    Employee(int flag) { 
     this.flag = flag; 
    } 

    public int method() { 
     if(flag) { 
      secondMethod(); 
     } 
     alwaysMethod(); 
    } 
+0

是的,'x'是一个枚举。我认为你正在做某件事。 –

+0

我最喜欢这个解决方案,在枚举中使用构造函数而不是重复方法定义。谢谢。 –

+0

好点,我从来没有在枚举中使用抽象方法,学习... –

1

我会通过通x拆分逻辑baz有创造新的开关:

switch(x) { 
case A: 
    foo(); 
    break; 
case B: 
case C: 
case D: 
case E: 
    bar(); 
    baz(x); // < --- 
    break; 
} 


void baz(SomeEnum val){ 
switch(val) {/* ...*/} 
} 
0

我想你的病例是固定的,所以你可以使用枚举,只是排除其中的一个。

public enum MyCase { 
    A, B, C, D, E; 
} 

和条件

MyCase x; 
... 
if MyCase.A.equals(x) { 
    foo(); 
} else { 
    bar(); 
} 
baz(x); 
// or if the oridnal value is required 
baz(x.ordinal);