2012-05-28 6 views
0

기본적으로 아래 코드가 주어집니다.if 문에서 벗어날 수 없습니까?

action = 2;mode = 1 일 때 i을 2로 설정 하시겠습니까?

동료 코드를 작성 중이며 다음과 같이 작성되어 있지만 휴식은 if를 건너 뛰고 나머지는 case 2으로 계속 진행할 것이라고 생각했습니다. 그래서 기본적으로 if 문은 무의미합니다.

switch(action){ 

    case 1: i = 1; break; 

    case 2: if(mode == 1) 
      { 
       break; 
      } 

      i = 2; 
      break; 

    case 3: i = 3; break; 

필자으로 이것을 다시 작성 :

case 2: if(mode != 1) 
      i = 2; 
     break; 

그러나 좀 더 복잡한 유일한 장소가 아니다,하고. 만약 내가 리팩터링하려고한다면 정확한 정보가 필요합니다.

답변

1

JLS section 14.15 : 1 < = 액션 < = 3, 코드가 단순화 가정 또한

break 문 전송은 바깥 쪽 문에서 제어 할 수 있습니다.

BreakStatement :

없는 레이블 break 문을 직접 둘러싸는 방법이나 이니셜 블록 switch, while, do 또는 for는 (강조 첨가)을 둘러싸는 최 제어를 전송하려고
break Identifieropt ; 

; 중단 목표라고하는이 명령.은 즉시 즉시 정상적으로 완료됩니다.

+0

실용적인 소스에 대한 자세한 답변을 보내 주셔서 감사합니다. – Doomsknight

7

"if 루프"와 같은 것은 없습니다. Break는 "if"문을 참조 할 수 없습니다.

언어 사양에 대한 포인터는 Wasserman's answer을 참조하십시오.

if(! (action == 2 && mode == 1)) { 
    i = action; 
} 
1

리팩토링이 올바른지 알고 싶으면 리팩터링이 올바른 것입니다.

+0

사실,하지만 'if 문에서 벗어나지 않겠습니까?'라는 질문에 대답하지 않았습니다. 정확함 +1, 화제 꺼짐 -1. – Tharwen

1

action == 2mode == 1의 경우 i = 2은 실행되지 않습니다 (왜 테스트하지 않습니까? 여기 묻는 것보다 빠름).

하지만 어쨌든 당신의 개선은 깨끗합니다. 나는 그것을 사용합니다.

+0

예기치 않게 뭔가를 실행하는 버그가 있습니다. 하지만 어쩌면, 나는 그것을위한 테스트 애플 리케이션을 작성해야합니다. ;) – Doomsknight

+0

메인 메소드를 코드에 붙이고 action = 2; mode = 1; 테스트가 있습니다. – Ixx