การกำหนดและใช้งาน 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); // 8valueOf() และการแยกวิเคราะห์
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดและใช้งาน Enum
- Enum ที่มีฟิลด์และเมธอด
- นิพจน์ Switch กับ Enum
- EnumSet และ EnumMap