Switch. Особенности

Switch. Особенности

Оператор switch использует метод equals для сравнения значения аргумента со значением, указанным в case. Он не сравнивает ссылочные переменные.


String day = new String("SUN");
 switch (day) {
     case "MON":
     case "THU": System.out.println("THU");
                break;
     case "FRY": System.out.println("FRY");
                break;
     case "SAT":
     case "SUN": System.out.println("Weekend");
                break;
     default: System.out.println("default");
}
        
System.out.println(day.equals("SUN")); // true
System.out.println(day.equals(new String("SUN"))); // true
System.out.println(day == new String("SUN")); // false
System.out.println(day == "SUN"); // false
Оператор switch принимает аргументы типов byte, char, short, int, классов-оболочек Byte, Character, Short, Integer, но не принимает типы long, float, double, Long, Float и Double.


long l = 1000L;
switch(l) {} // ошибка компиляции: несовместимые типы, long нельзя привести к int без потерь
Значения, указанные в секции case должны быть известны на стадии компиляции. Следующий код не скомпилируется, т.к. компилятор не уверен, что значения переменных не изменятся до того, как попадут в секцию case:


int a = 50, b = 20, c = 30;
switch(a) {
     case b + c : System.out.println(b + c); // ошибка компиляции
     case 20 * 30 : System.out.println(20 * 30); // эта строка скомпилируется успешно
        }
Если переменные b и c сделать final, то ошибок не возникнет:


int a = 50;
final int b = 20, c = 30;
switch (a) {
     case b + c: System.out.println(b + c);
     case 20 * 30: System.out.println(20 * 30);
}
Однако, если final-переменная не будет проинициализирована сразу при объявлении, то код тоже не скомпилируется:


int a = 50;
final int b = 20; 
final int c;
c = 30;
switch (a) {
     case b + c:  // ошибка компиляции, выражение должно быть константой
         System.out.println(b + c);
     case 20 * 30: System.out.println(20 * 30);
     case 10/3:  // скомпилируется успешно, т.к. int/int = int
         System.out.println(10 / 3);
        }
Следующий код тоже не скомпилируется. Хоть checkDay и объявлен как final, он не является константой.


void runSomeSwitch(final String checkDay) {
        String day = "SUN";
        switch(day) {
            default: System.out.println("It's not a secret day"); 
                break;
            case checkDay: // ошибка компиляции, выражение должно быть константой
                System.out.println(checkDay);
                break;
      }
}
Условия и Циклы