0Pricing
Java Academy · บทเรียน

นิพจน์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การกำหนดและใช้งาน Enum
  2. Enum ที่มีฟิลด์และเมธอด
  3. นิพจน์ Switch กับ Enum
  4. EnumSet และ EnumMap
← กลับไปที่ Java Academy