นิพจน์ Switch กับ Enum
ใช้นิพจน์ switch สมัยใหม่ร่วมกับ enum เพื่อแบ่งแขนงอย่างกระชับและครอบคลุมทุกกรณี
นิพจน์ Switch กับ Enum เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
นิพจน์เลือกสาขากับชนิดแจงนับ
นิพจน์เลือกสาขา (Java 14 ขึ้นไป) ที่ใช้กับชนิดแจงนับช่วยให้การเลือกเส้นทางตามชนิดข้อมูลครอบคลุมทุกกรณีและกระชับ เมื่อครอบคลุมค่าคงที่ของชนิดแจงนับทั้งหมดแล้ว ก็ไม่จำเป็นต้องมี default
คำสั่งเลือกสาขาแบบดั้งเดิม
คำสั่งเลือกสาขาแบบดั้งเดิมทำงานร่วมกับชนิดแจงนับได้ แต่ต้องใช้ break เพื่อป้องกันการไหลต่อไปยังกรณีถัดไป
enum Severity { LOW, MEDIUM, HIGH, CRITICAL }
Severity s = Severity.HIGH;
String action;
switch (s) {
case LOW:
action = "Log and monitor";
break;
case MEDIUM:
action = "Notify on-call team";
break;
case HIGH:
action = "Page engineer immediately";
break;
case CRITICAL:
action = "Activate incident response";
break;
default:
action = "Unknown";
}
System.out.println(action); // Page engineer immediatelyนิพจน์เลือกสาขาพร้อมป้ายกำกับลูกศร
นิพจน์เลือกสาขาที่ใช้ป้ายกำกับลูกศรช่วยกำจัดการไหลต่อและ break นิพจน์เหล่านี้ประเมินค่าเป็นผลลัพธ์และต้องครอบคลุมทุกกรณี
enum Severity { LOW, MEDIUM, HIGH, CRITICAL }
Severity s = Severity.HIGH;
String action = switch (s) {
case LOW -> "Log and monitor";
case MEDIUM -> "Notify on-call team";
case HIGH -> "Page engineer immediately";
case CRITICAL -> "Activate incident response";
// no default needed — all cases covered
};
System.out.println(action); // Page engineer immediatelyนิพจน์เลือกสาขาพร้อมบล็อก
เมื่อการทำงานของกรณีใดต้องใช้คำสั่งหลายรายการ ให้ใช้บล็อกพร้อมคำสั่งส่งคืนผลลัพธ์เพื่อสร้างค่าผลลัพธ์
enum DayOfWeek { MON, TUE, WED, THU, FRI, SAT, SUN }
DayOfWeek day = DayOfWeek.FRI;
int hoursOpen = switch (day) {
case MON, TUE, WED, THU -> 8;
case FRI -> {
System.out.println("Half day on Friday!");
yield 4; // yield returns value from block
}
case SAT, SUN -> 0;
};
System.out.println("Hours open: " + hoursOpen); // Hours open: 4การจัดกลุ่มหลายกรณี
ค่าคงที่ของอีนัมหลายค่าตัวสามารถใช้กรณีเดียวกันได้ โดยคั่นด้วยเครื่องหมายจุลภาค
enum Season { SPRING, SUMMER, FALL, WINTER }
Season season = Season.SUMMER;
String activity = switch (season) {
case SPRING, FALL -> "Hike in the mountains";
case SUMMER -> "Beach vacation";
case WINTER -> "Ski at the resort";
};
System.out.println(activity); // Beach vacationการคืนค่าจากเมธอดด้วยสวิตช์
นิพจน์สวิตช์เหมาะอย่างยิ่งสำหรับใช้เป็นคำสั่งคืนค่าในเมธอด ทำให้เจตนาของโค้ดชัดเจน
enum Priority { LOW, NORMAL, HIGH, URGENT }
static int getSlaHours(Priority p) {
return switch (p) {
case LOW -> 72;
case NORMAL -> 24;
case HIGH -> 4;
case URGENT -> 1;
};
}
System.out.println(getSlaHours(Priority.URGENT)); // 1
System.out.println(getSlaHours(Priority.LOW)); // 72นิพจน์สวิตช์ใน stream
สามารถใช้นิพจน์สวิตช์ภายในการดำเนินการกับ stream เพื่อแปลงข้อมูลแต่ละรายการได้อย่างเป็นระเบียบ
import java.util.*;
import java.util.stream.*;
enum Status { PENDING, ACTIVE, CLOSED }
record Account(String id, Status status) {}
List<Account> accounts = List.of(
new Account("A1", Status.ACTIVE),
new Account("A2", Status.PENDING),
new Account("A3", Status.CLOSED)
);
accounts.stream()
.map(a -> a.id() + ": " + switch (a.status()) {
case ACTIVE -> "\u2705 Live";
case PENDING -> "\u23f3 Awaiting activation";
case CLOSED -> "\u274c Deactivated";
})
.forEach(System.out::println);การตรวจสอบความครอบคลุมขณะคอมไพล์
คอมไพเลอร์จะบังคับให้ครอบคลุมค่าคงที่ของอีนัมทั้งหมด เมื่อเพิ่มค่าคงที่ใหม่ให้กับอีนัม จะเกิดข้อผิดพลาดขณะคอมไพล์ในนิพจน์สวิตช์ทั้งหมดที่ไม่ได้จัดการค่าดังกล่าว
enum Color { RED, GREEN, BLUE } // add YELLOW here → compile error below
Color c = Color.GREEN;
// This switch is exhaustive for RED, GREEN, BLUE
// If you add YELLOW to the enum without adding a case here,
// the compiler will report an error.
String hex = switch (c) {
case RED -> "#FF0000";
case GREEN -> "#00FF00";
case BLUE -> "#0000FF";
};
System.out.println(hex); // #00FF00สวิตช์ที่มีกรณีค่าเริ่มต้นเพื่อความปลอดภัย
เมื่อใช้คำสั่งสวิตช์ (ไม่ใช่นิพจน์) หรือเมื่อตั้งใจให้สวิตช์ครอบคลุมเพียงบางกรณี ให้เพิ่มกรณีค่าเริ่มต้น
enum Feature { DARK_MODE, PUSH_NOTIFICATIONS, ANALYTICS, BETA_FEATURE }
static boolean isEnabled(Feature feature) {
return switch (feature) {
case DARK_MODE, PUSH_NOTIFICATIONS -> true;
case ANALYTICS -> false;
default -> {
System.out.println("Unknown feature: " + feature);
yield false;
}
};
}
System.out.println(isEnabled(Feature.DARK_MODE)); // true
System.out.println(isEnabled(Feature.BETA_FEATURE)); // falseภาคปฏิบัติ: วงจรชีวิตของคำสั่งซื้อ
เครื่องสถานะวงจรชีวิตของคำสั่งซื้อแบบครบถ้วน ซึ่งใช้นิพจน์สวิตช์เพื่อกำหนดการเปลี่ยนสถานะที่อนุญาต
enum OrderState { CART, PENDING, CONFIRMED, SHIPPED, DELIVERED, CANCELLED }
static Set<OrderState> allowedTransitions(OrderState from) {
return switch (from) {
case CART -> Set.of(OrderState.PENDING, OrderState.CANCELLED);
case PENDING -> Set.of(OrderState.CONFIRMED, OrderState.CANCELLED);
case CONFIRMED -> Set.of(OrderState.SHIPPED);
case SHIPPED -> Set.of(OrderState.DELIVERED);
case DELIVERED, CANCELLED -> Set.of(); // terminal states
};
}
System.out.println(allowedTransitions(OrderState.PENDING));
// [CONFIRMED, CANCELLED]สวิตช์โดยใช้ String เทียบกับอีนัม
การใช้สวิตช์กับ String ต้องตรวจสอบค่าว่างและแยกตัวพิมพ์เล็กใหญ่ การใช้สวิตช์กับอีนัมจะเกิด NPE หากเป็นค่าว่าง และตรวจสอบชนิดข้อมูลได้อย่างปลอดภัย จึงควรเลือกใช้อีนัมเมื่อทราบชุดค่าที่เป็นไปได้แน่นอน
// String switch — fragile
String role = "admin";
String label = switch (role.toLowerCase()) {
case "admin" -> "Administrator";
case "guest" -> "Guest User";
default -> "Unknown";
};
// Enum switch — type-safe
enum Role { ADMIN, GUEST }
Role r = Role.ADMIN;
String label2 = switch (r) {
case ADMIN -> "Administrator";
case GUEST -> "Guest User";
};
System.out.println(label2); // Administratorตรวจสอบความเข้าใจ
คุณมีอีนัมที่มีค่าคงที่ 4 ค่า และเขียนนิพจน์สวิตช์ที่ครอบคลุมทั้ง 4 ค่า จะเกิดอะไรขึ้นหากเพิ่มค่าคงที่ตัวที่ 5 ให้กับอีนัม
สรุปทบทวน: นิพจน์สวิตช์กับอีนัม
ประเด็นสำคัญ:
- นิพจน์สวิตช์ที่ใช้ป้ายกำกับแบบลูกศรไม่ต้องใช้ break และไม่มีการไหลต่อไปยังกรณีถัดไป
- ใช้ yield เพื่อคืนค่าจากกรณีที่เป็นบล็อก
- จัดกลุ่มค่าคงที่หลายค่าด้วยเครื่องหมายจุลภาค: case A, B ->
- นิพจน์สวิตช์ที่ครอบคลุมทุกกรณีไม่จำเป็นต้องมีกรณีค่าเริ่มต้น
- การเพิ่มค่าคงที่ใหม่ของอีนัมจะทำให้เกิดข้อผิดพลาดขณะคอมไพล์ในนิพจน์สวิตช์ที่ครอบคลุมครบถ้วน
- นิพจน์สวิตช์เหมาะอย่างยิ่งสำหรับการดำเนินการ map() ของ stream
คำถามที่พบบ่อย
บทเรียน “นิพจน์ Switch กับ Enum” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “นิพจน์ Switch กับ Enum” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “นิพจน์ Switch กับ Enum”
ใช้นิพจน์ switch สมัยใหม่ร่วมกับ enum เพื่อแบ่งแขนงอย่างกระชับและครอบคลุมทุกกรณี คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “นิพจน์ Switch กับ Enum” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดและใช้งาน Enum
- Enum ที่มีฟิลด์และเมธอด
- นิพจน์ Switch กับ Enum
- EnumSet และ EnumMap