[java] 왜 우리는 사건 진술 후 휴식이 필요합니까?

컴파일러가 스위치의 각 코드 블록 뒤에 자동으로 break 문을 넣지 않는 이유는 무엇입니까? 역사적 이유 때문입니까? 여러 코드 블록을 언제 실행하고 싶습니까?



답변

때로는 동일한 코드 블록과 관련된 여러 사례를 갖는 것이 도움이됩니다.

case 'A':
case 'B':
case 'C':
    doSomething();
    break;

case 'D':
case 'E':
    doSomethingElse();
    break;

등. 단지 예입니다.

내 경험상 일반적으로 “넘어가는”스타일이 좋지 않고 한 경우에 여러 개의 코드 블록을 실행하는 것이 좋지만 상황에 따라 사용할 수도 있습니다.


답변

역사적으로 , case는 기본적 으로 호출 label대상 지점 이라고도 하는를 정의 했기 때문 goto입니다. switch 문과 관련 사례는 실제로 코드 스트림에 대한 여러 잠재적 진입 점이있는 다중 분기를 나타냅니다.

즉, break거의 모든 경우가 끝날 때마다 원하는 기본 동작 인 거의 무한한 횟수가 기록되었습니다 .


답변

Java는 C에서 왔으며 이것이 C의 구문입니다.

여러 case 문이 하나의 실행 경로 만 갖기를 원하는 경우가 있습니다. 다음은 한 달에 며칠을 알려주는 샘플입니다.

class SwitchDemo2 {
    public static void main(String[] args) {

        int month = 2;
        int year = 2000;
        int numDays = 0;

        switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                numDays = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                numDays = 30;
                break;
            case 2:
                if ( ((year % 4 == 0) && !(year % 100 == 0))
                     || (year % 400 == 0) )
                    numDays = 29;
                else
                    numDays = 28;
                break;
            default:
                System.out.println("Invalid month.");
                break;
        }
        System.out.println("Number of Days = " + numDays);
    }
}


답변

실수라고 생각합니다. 언어 구조 break로서 기본값 만큼이나 쉽게 fallthrough키워드 를 가지고 있습니다 . 내가 작성하고 읽은 대부분의 코드는 모든 경우마다 중단됩니다.


답변

케이스 폴스 루로 모든 종류의 흥미로운 일을 할 수 있습니다.

예를 들어 모든 경우에 특정 작업을 수행하고 싶지만 특정 경우에는 해당 작업과 다른 작업을 수행하고 싶다고 가정 해 보겠습니다. fall-through와 함께 switch 문을 사용하면 매우 쉽게 할 수 있습니다.

switch (someValue)
{
    case extendedActionValue:
        // do extended action here, falls through to normal action
    case normalActionValue:
    case otherNormalActionValue:
        // do normal action here
        break;
}

물론 break사건이 끝날 때 그 진술 을 잊어 버리고 예상치 못한 동작을 유발 하기 쉽습니다 . 좋은 컴파일러는 break 문을 생략하면 경고합니다.


답변

컴파일러가 스위치의 각 코드 블록 뒤에 자동으로 break 문을 넣지 않는 이유는 무엇입니까?

여러 경우 (특별한 경우 일 수 있음)에 대해 동일한 블록을 사용할 수 있다는 좋은 욕망을 제쳐두고 …

역사적 이유 때문입니까? 여러 코드 블록을 언제 실행하고 싶습니까?

주로 C와의 호환성을위한 것이며 goto키워드가 지구를 돌아 다니던 옛날부터의 고대 해킹 일 것입니다 . 그것은 않습니다 같은 물론 몇 가지 놀라운 일들 활성화 더프의 장치를 하지만, 그 여부는 유리한 점은 나입니다 … 논란의 여지가 최선을 상대로.


답변

break후 스위치 case들 스위치 문에서 위해 fallthrough을 방지하기 위해 사용된다. 흥미롭게도 JEP-325 를 통해 구현 된 새로 형성된 스위치 레이블을 통해이 작업을 수행 할 수 있습니다 .

이러한 변경 사항으로 인해 추가 시연 된대로 break모든 스위치 case를 사용하지 않아도됩니다.

public class SwitchExpressionsNoFallThrough {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int value = scanner.nextInt();
        /*
         * Before JEP-325
         */
        switch (value) {
            case 1:
                System.out.println("one");
            case 2:
                System.out.println("two");
            default:
                System.out.println("many");
        }

        /*
         * After JEP-325
         */
        switch (value) {
            case 1 ->System.out.println("one");
            case 2 ->System.out.println("two");
            default ->System.out.println("many");
        }
    }
}

JDK-12와, 상기 코드를 실행하는 상기 비교 출력 으로 볼 수

//input
1
// output from the implementation before JEP-325
one
two
many
// output from the implementation after JEP-325
one

//input
2
// output from the implementation before JEP-325
two
many
// output from the implementation after JEP-325
two

물론 변경되지 않은 것은

// input
3
many // default case match
many // branches to 'default' as well