Bỏ qua để đến nội dung

switch case

int day = 3;
String name;
switch (day) {
case 1:
name = "Thứ Hai";
break;
case 2:
name = "Thứ Ba";
break;
case 3:
name = "Thứ Tư";
break;
default:
name = "Không xác định";
break;
}
System.out.println(name); // Thứ Tư

switch truyền thống so sánh giá trị của biểu thức với từng case; break dùng để thoát khỏi switch sau khi tìm thấy nhánh khớp. Nếu thiếu break, chương trình sẽ “rơi tiếp” (fall-through) xuống case bên dưới - xem chi tiết lỗi thường gặp này ở trang “Switch fall-through” trong mục What the Java!.

Ngoài kiểu số nguyên, switch còn hoạt động với Stringenum:

String fruit = "cam";
switch (fruit) {
case "táo":
System.out.println("Quả táo");
break;
case "cam":
System.out.println("Quả cam");
break;
default:
System.out.println("Không rõ loại quả");
}

Từ Java 14, switch có thể dùng như một biểu thức (trả về giá trị) với cú pháp mũi tên ->, không cần breakkhông bị fall-through:

int day = 3;
String name = switch (day) {
case 1 -> "Thứ Hai";
case 2 -> "Thứ Ba";
case 3 -> "Thứ Tư";
default -> "Không xác định";
};
System.out.println(name); // Thứ Tư

Có thể gộp nhiều nhãn (label) trên cùng một dòng:

String dayType = switch (day) {
case 1, 2, 3, 4, 5 -> "Ngày trong tuần";
case 6, 7 -> "Cuối tuần";
default -> "Không hợp lệ";
};

Khi một nhánh cần nhiều dòng lệnh, dùng khối {} cùng từ khóa yield để trả về giá trị:

int score = 82;
String rank = switch (score / 10) {
case 10, 9 -> "Xuất sắc";
case 8 -> {
System.out.println("Gần đạt mức xuất sắc!");
yield "Giỏi";
}
default -> "Cần cố gắng thêm";
};

Từ Java 21, switch còn hỗ trợ pattern matching - kiểm tra và ép kiểu (cast) đối tượng ngay trong case, giúp code ngắn gọn hơn nhiều so với chuỗi if instanceof lồng nhau:

Object obj = "Hello";
String result = switch (obj) {
case Integer i -> "Số nguyên: " + i;
case String s -> "Chuỗi có độ dài " + s.length();
default -> "Không xác định";
};

Đây là tính năng nâng cao, thường gặp trong code Java hiện đại - sẽ được tìm hiểu kỹ hơn ở các bài nâng cao sau.

  • switch truyền thống dùng case/break, dễ quên break gây fall-through
  • Switch expression (->, Java 14+) trả về giá trị trực tiếp, an toàn hơn vì không fall-through
  • yield dùng để trả giá trị từ một khối {} nhiều dòng trong switch expression
  • Pattern matching cho switch (Java 21+) cho phép kiểm tra kiểu ngay trong case