[java] 하나의 스위치 케이스 명령문에 두 개의 값 사용

내 코드에서 프로그램은 사용자가 입력 한 텍스트에 따라 무언가를 수행합니다. 내 코드는 다음과 같습니다

switch (name) {
        case text1: {
            //blah
            break;
        }
        case text2: {
            //blah
            break;
        }
        case text3: {
            //blah
            break;
        }
        case text4: {
            //blah
            break;
        }

그러나 코드 내부의 경우 text1text4동일합니다. 따라서 다음과 같은 것을 구현할 수 있는지 궁금합니다.

case text1||text4: {
            //blah
            break;
        }

나는 알고 ||작업자가 case 문에없는 일이지만 비슷한 뭔가 내가 사용할 수 있습니다 것입니다.



답변

CASE다음과 같이 두 가지 진술을 모두 사용할 수 있습니다 .

  case text1:
  case text4:{
            //blah
            break;
        }

이 예 참조 : 코드 예는 특정 달의 일 수를 계산합니다.

class SwitchDemo {
    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);
    }
}

이것은 코드의 출력입니다.

Number of Days = 29

실패로 끝나다:

또 다른 관심 지점은 브레이크 선언입니다. 각 break 문은 둘러싸는 switch 문을 종료합니다. 제어 흐름은 스위치 블록 다음에 오는 첫 번째 명령문으로 계속됩니다. 스위치 블록에 명령문이 없으면 break 문이 필요 fall
through
합니다. 일치하는 case 레이블 뒤의 모든 명령문은 break case가 나타날 때까지 후속 케이스 레이블의 표현식에 관계없이 순서대로 실행됩니다.

예제 코드 :

public class SwitchFallThrough {

    public static void main(String[] args) {
        java.util.ArrayList<String> futureMonths =
            new java.util.ArrayList<String>();

        int month = 8;

        switch (month) {
            case 1:  futureMonths.add("January");
            case 2:  futureMonths.add("February");
            case 3:  futureMonths.add("March");
            case 4:  futureMonths.add("April");
            case 5:  futureMonths.add("May");
            case 6:  futureMonths.add("June");
            case 7:  futureMonths.add("July");
            case 8:  futureMonths.add("August");
            case 9:  futureMonths.add("September");
            case 10: futureMonths.add("October");
            case 11: futureMonths.add("November");
            case 12: futureMonths.add("December");
            default: break;
        }

        if (futureMonths.isEmpty()) {
            System.out.println("Invalid month number");
        } else {
            for (String monthName : futureMonths) {
               System.out.println(monthName);
            }
        }
    }
}

이것은 코드의 출력입니다.

August
September
October
November
December

스위치 명령문에서 문자열 사용

Java SE 7 이상에서는 switch 문의 표현식에 String 객체를 사용할 수 있습니다. 다음 코드 예제는 month라는 문자열 값을 기준으로 월 수를 표시합니다.

public class StringSwitchDemo {

    public static int getMonthNumber(String month) {

        int monthNumber = 0;

        if (month == null) {
            return monthNumber;
        }

        switch (month.toLowerCase()) {
            case "january":
                monthNumber = 1;
                break;
            case "february":
                monthNumber = 2;
                break;
            case "march":
                monthNumber = 3;
                break;
            case "april":
                monthNumber = 4;
                break;
            case "may":
                monthNumber = 5;
                break;
            case "june":
                monthNumber = 6;
                break;
            case "july":
                monthNumber = 7;
                break;
            case "august":
                monthNumber = 8;
                break;
            case "september":
                monthNumber = 9;
                break;
            case "october":
                monthNumber = 10;
                break;
            case "november":
                monthNumber = 11;
                break;
            case "december":
                monthNumber = 12;
                break;
            default:
                monthNumber = 0;
                break;
        }

        return monthNumber;
    }

    public static void main(String[] args) {

        String month = "August";

        int returnedMonthNumber =
            StringSwitchDemo.getMonthNumber(month);

        if (returnedMonthNumber == 0) {
            System.out.println("Invalid month");
        } else {
            System.out.println(returnedMonthNumber);
        }
    }
}

이 코드의 출력은 8입니다.

자바 문서에서


답변

당신은 다음과 같이 할 수 있습니다 :

case text1:
case text4: {
            //blah
            break;
}


답변

case값은있는 동일한 항목 포인트를 공유 할 수 있습니다 “고토”포인트 코드없는 :

case text1:
case text4:
    //blah
    break;

중괄호는 중복입니다.


답변

그냥 해

case text1: case text4:
     do stuff;
     break;


답변

JDK-12 초기 액세스 빌드에서 JEP 325 : Switch Expressions (Preview) 의 통합으로 이제 새로운 형식의 스위치 레이블을 다음과 같이 사용할 수 있습니다.

case text1, text4 -> {
     //blah
} 

또는 답변 중 하나 에서 데모를 바꾸려면 :-

public class RephraseDemo {

    public static void main(String[] args) {
        int month = 9;
        int year = 2018;
        int numDays = 0;

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

            }
        }
        System.out.println("Number of Days = " + numDays);
    }
}

– 여기 당신이 그것을 시도 줄 수있는 방법입니다 메이븐과 함께 컴파일시 JDK12 미리보기 기능을


답변

괄호는 불필요합니다. 그냥 해

case text1:
case text4:
  doSomethingHere();
  break;
case text2:
  doSomethingElse()
  break;

호기심이 많은 사람을 케이스 폴 스루라고합니다. 이를 수행 할 수있는 능력이 break;사례 진술을 끝내야 하는 이유 입니다. 자세한 정보는 wikipedia 기사 http://en.wikipedia.org/wiki/Switch_statement를 참조하십시오 .


답변

fallthrough다른 사람들 의 대답은 좋은 것입니다.

그러나 또 다른 접근법은 사례 진술의 내용에서 메소드를 추출한 다음 각 사례에서 적절한 메소드를 호출하는 것입니다.

아래 예에서 ‘text1’과 ‘text4’는 모두 동일하게 작동합니다.

switch (name) {
        case text1: {
            method1();
            break;
        }
        case text2: {
            method2();
            break;
        }
        case text3: {
            method3();
            break;
        }
        case text4: {
            method1();
            break;
        }

필자는 개인적으로 이러한 스타일의 쓰기 사례 문장이 유지 관리가 쉽고 약간 더 읽기 쉽다는 것을 알고 있습니다.