
Оператор 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;
}
}