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

การกำหนดและใช้งาน Enum

ประกาศชนิด enum ใช้ค่าคงที่ของ enum และวนซ้ำด้วย values() และ ordinal()

การกำหนดและใช้งาน Enum เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

การกำหนดและใช้งานชนิดแจงนับ

ชนิดแจงนับ (การแจกแจง) คือคลาสพิเศษที่แทนชุดค่าคงที่ที่กำหนดไว้ตายตัว ชนิดแจงนับมีความปลอดภัยด้านชนิดข้อมูล อ่านเข้าใจง่าย และมีความสามารถมากกว่าค่าคงที่ชนิด int แบบสแตติก

การประกาศชนิดแจงนับ

ใช้คีย์เวิร์ด enum เพื่อประกาศการแจกแจง ค่าคงที่แต่ละค่าจะเป็น public static final โดยปริยาย และเป็นอินสแตนซ์ของชนิดแจงนับนั้น

enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
    FRIDAY, SATURDAY, SUNDAY
}

Day today = Day.WEDNESDAY;
System.out.println(today);          // WEDNESDAY
System.out.println(today.name());   // WEDNESDAY
System.out.println(today.ordinal()); // 2 (zero-based index)

การวนซ้ำด้วย values()

EnumType.values() คืนค่าคงที่ทั้งหมดตามลำดับที่ประกาศ ใช้เพื่อวนซ้ำหรือสร้างเมนูได้

enum Planet { MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE }

for (Planet p : Planet.values()) {
    System.out.println(p.ordinal() + ": " + p);
}
// 0: MERCURY
// 1: VENUS
// 2: EARTH
// ...

// Count constants
System.out.println(Planet.values().length); // 8

valueOf() และการแยกวิเคราะห์

Enum.valueOf(name) แปลง String เป็นค่าคงที่ที่ตรงกัน หากไม่พบค่าดังกล่าว จะทำให้เกิด IllegalArgumentException

enum Status { PENDING, ACTIVE, SUSPENDED, CLOSED }

String input = "ACTIVE";
Status s = Status.valueOf(input);
System.out.println(s); // ACTIVE

try {
    Status bad = Status.valueOf("UNKNOWN");
} catch (IllegalArgumentException e) {
    System.out.println("Invalid status: UNKNOWN");
}

// Safe parse pattern
static Status safeFrom(String name) {
    try { return Status.valueOf(name.toUpperCase()); }
    catch (IllegalArgumentException e) { return Status.PENDING; }
}

การใช้ชนิดแจงนับในการเลือกสาขา

ชนิดแจงนับทำงานร่วมกับคำสั่งและนิพจน์เลือกสาขาได้อย่างสมบูรณ์แบบ นิพจน์เลือกสาขาสมัยใหม่ทำให้การเลือกการทำงานตามชนิดแจงนับกระชับและครอบคลุมทุกกรณี

enum OrderStatus { CREATED, PROCESSING, SHIPPED, DELIVERED, CANCELLED }

OrderStatus status = OrderStatus.SHIPPED;

String message = switch (status) {
    case CREATED     -> "Order received, awaiting payment";
    case PROCESSING  -> "Payment confirmed, preparing shipment";
    case SHIPPED     -> "On the way — track your package";
    case DELIVERED   -> "Delivered! Enjoy your order";
    case CANCELLED   -> "Order cancelled";
};
System.out.println(message); // On the way — track your package

ชนิดแจงนับกับ if/else

ใช้ == เพื่อเปรียบเทียบค่าคงที่ของชนิดแจงนับ เพราะค่าคงที่เหล่านี้เป็นอินสแตนซ์แบบมีเพียงหนึ่งเดียว ดังนั้นการเปรียบเทียบการอ้างอิงจึงทำงานได้อย่างถูกต้อง

enum UserRole { GUEST, MEMBER, ADMIN, SUPERADMIN }

UserRole role = UserRole.ADMIN;

if (role == UserRole.ADMIN || role == UserRole.SUPERADMIN) {
    System.out.println("Access granted to admin panel");
} else {
    System.out.println("Access denied");
}

// Enum comparison: never use .equals() for enums
// == is correct and more readable

ชนิดแจงนับในโครงสร้างรวบรวม

สามารถจัดเก็บชนิดแจงนับไว้ในโครงสร้างรวบรวมมาตรฐานได้ ใช้ EnumSet และ EnumMap สำหรับการจัดเก็บข้อมูลที่อิงชนิดแจงนับและมีประสิทธิภาพสูง (จะกล่าวถึงในบทเรียนถัดไป)

import java.util.*;

enum Permission { READ, WRITE, DELETE, ADMIN }

Set<Permission> userPerms = new HashSet<>();
userPerms.add(Permission.READ);
userPerms.add(Permission.WRITE);

System.out.println(userPerms.contains(Permission.DELETE)); // false
System.out.println(userPerms.contains(Permission.READ));   // true

List<Permission> allPerms = Arrays.asList(Permission.values());
System.out.println(allPerms.size()); // 4

ชนิดแจงนับใช้ส่วนติดต่อได้

ชนิดแจงนับสามารถใช้ส่วนติดต่อได้ ทำให้คุณแนบพฤติกรรมให้กับค่าคงที่แต่ละค่า หรือกำหนดข้อกำหนดร่วมสำหรับค่าคงที่ทั้งหมดได้

interface Describable {
    String describe();
}

enum Season implements Describable {
    SPRING, SUMMER, FALL, WINTER;

    public String describe() {
        return switch (this) {
            case SPRING -> "Mild and rainy";
            case SUMMER -> "Hot and sunny";
            case FALL   -> "Cool with falling leaves";
            case WINTER -> "Cold and snowy";
        };
    }
}

for (Season s : Season.values()) {
    System.out.println(s + ": " + s.describe());
}

ชนิดแจงนับในเครื่องจักรสถานะ

ชนิดแจงนับเหมาะกับเครื่องจักรสถานะโดยธรรมชาติ ค่าคงที่แต่ละค่าจะแทนสถานะหนึ่งสถานะ และเมธอดจะกำหนดการเปลี่ยนสถานะที่ถูกต้อง

enum TrafficLight {
    RED, YELLOW, GREEN;

    public TrafficLight next() {
        return switch (this) {
            case RED    -> GREEN;
            case GREEN  -> YELLOW;
            case YELLOW -> RED;
        };
    }
}

TrafficLight light = TrafficLight.RED;
for (int i = 0; i < 6; i++) {
    System.out.println(light);
    light = light.next();
}
// RED, GREEN, YELLOW, RED, GREEN, YELLOW

แนวทางปฏิบัติที่ดีสำหรับชนิดแจงนับ

ปฏิบัติตามแนวทางที่ดีเหล่านี้เมื่อใช้ชนิดแจงนับ:

  • ใช้ชื่อค่าคงที่เป็นตัวพิมพ์ใหญ่ทั้งหมดและคั่นด้วยขีดล่าง (ตามธรรมเนียม)
  • เลือกใช้ชนิดแจงนับแทนค่าคงที่ชนิด int หรือ String เพื่อความปลอดภัยด้านชนิดข้อมูล
  • ใช้นิพจน์เลือกสาขาสำหรับการเลือกการทำงานที่ครอบคลุมทุกกรณี
  • เพิ่มฟิลด์และเมธอดให้ชนิดแจงนับเมื่อค่าคงที่มีข้อมูลกำกับ

ภาคปฏิบัติ: รหัสสถานะ HTTP

ชนิดแจงนับในสถานการณ์จริงสำหรับจำลองหมวดหมู่รหัสสถานะ HTTP พร้อมเมธอดสร้างอินสแตนซ์จากรหัสตัวเลข

enum HttpStatus {
    OK(200), CREATED(201), BAD_REQUEST(400),
    UNAUTHORIZED(401), NOT_FOUND(404), SERVER_ERROR(500);

    public final int code;

    HttpStatus(int code) { this.code = code; }

    public static HttpStatus from(int code) {
        for (HttpStatus s : values())
            if (s.code == code) return s;
        throw new IllegalArgumentException("Unknown HTTP code: " + code);
    }

    public boolean isSuccess() { return code >= 200 && code < 300; }
}

HttpStatus s = HttpStatus.from(404);
System.out.println(s + " (" + s.code + ") success=" + s.isSuccess());
// NOT_FOUND (404) success=false

ตรวจสอบอย่างรวดเร็ว

โค้ดต่อไปนี้ให้ผลลัพธ์เป็นอะไร

enum Color { RED, GREEN, BLUE }
System.out.println(Color.GREEN.ordinal());

ทบทวน: การกำหนดและใช้งานชนิดแจงนับ

ประเด็นสำคัญ:

  • ชนิดแจงนับกำหนดชุดค่าคงที่ที่มีชื่อและปลอดภัยด้านชนิดข้อมูล
  • values() วนซ้ำค่าคงที่ทั้งหมด ส่วน ordinal() ให้ดัชนีที่เริ่มจากศูนย์
  • valueOf() แปลง String เป็นค่าคงที่ที่ตรงกัน
  • ใช้ == (ไม่ใช่ equals) เพื่อเปรียบเทียบอินสแตนซ์ของชนิดแจงนับ
  • ชนิดแจงนับทำงานได้ดีในนิพจน์เลือกสาขาที่ครอบคลุมทุกกรณี
  • ชนิดแจงนับสามารถใช้ส่วนติดต่อเพื่อแนบพฤติกรรมให้ค่าคงที่แต่ละค่า

คำถามที่พบบ่อย

บทเรียน “การกำหนดและใช้งาน Enum” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การกำหนดและใช้งาน Enum” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การกำหนดและใช้งาน Enum”

ประกาศชนิด enum ใช้ค่าคงที่ของ enum และวนซ้ำด้วย values() และ ordinal() คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การกำหนดและใช้งาน Enum” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม

ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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