2013-12-21 3 views
4

switch 문을 사용하고 싶지만 코드를 복제하거나 동봉 된 if 문을 사용하지 않고 구성 할 수는 없습니다. 이 문제를 해결할 방법이 있습니까?switch 문에 코드 재사용 (Java)

나는 5 가지 경우가 있으며 그 중 하나만 제외하고 나는 어떤 행동을하고 싶다. 따라서 switch 성명서를 사용하면 할 수 있습니다.

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

쉬운. 그러나 어려움은 또한 각자 다른 뚜렷한 행동을 수행해야하기 때문에 나는 그 사건의 뚜렷한 특징을 사용할 수 없다. 그래서 코드를 복제하지 않습니다 중 하나

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

로 감소하고있어,하지만 날 귀찮게 거기 I 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

좋은 점, 나는 enums에서 추상적 인 메소드를 사용하지 않았다 ... –

1

나는 baz에 통과 x에 의해 논리를 분할하고 거기에 새로운 스위치를 만들 것입니다 :

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); 
관련 문제