Enum ที่มีฟิลด์และเมธอด
เพิ่มฟิลด์ ตัวสร้าง และเมธอดให้ enum เพื่อห่อหุ้มพฤติกรรม
Enum ที่มีฟิลด์และเมธอด เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
ชนิดแจงนับที่มีฟิลด์และเมธอด
ค่าคงที่ของชนิดแจงนับสามารถมีข้อมูลกำกับได้ โดยประกาศฟิลด์และตัวสร้าง ตัวสร้างจะเป็น private โดยอัตโนมัติ
การประกาศฟิลด์ในชนิดแจงนับ
ค่าคงที่ของชนิดแจงนับแต่ละค่าจะเรียกตัวสร้างเมื่อคลาสถูกโหลด ค่าของฟิลด์จะถูกกำหนดเพียงครั้งเดียวและเปลี่ยนแปลงไม่ได้ (เมื่อประกาศเป็น final)
enum Planet {
MERCURY(3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6);
private final double mass; // kilograms
private final double radius; // meters
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
public double mass() { return mass; }
public double radius() { return radius; }
}การเพิ่มเมธอดให้ชนิดแจงนับ
ชนิดแจงนับสามารถมีเมธอดใด ๆ ที่คุณใส่ไว้ในคลาสได้ รวมถึงคุณสมบัติที่คำนวณขึ้น
enum Planet {
EARTH(5.976e+24, 6.37814e6);
// ... constructor and fields ...
static final double G = 6.67300E-11;
public double surfaceGravity() {
return G * mass / (radius * radius);
}
public double surfaceWeight(double otherMass) {
return otherMass * surfaceGravity();
}
}
double earthWeight = 75.0;
double mass = earthWeight / Planet.EARTH.surfaceGravity();
for (Planet p : Planet.values())
System.out.printf("Weight on %s: %.2f%n", p, p.surfaceWeight(mass));เมธอดนามธรรมบนค่าคงที่ของชนิดแจงนับ
ค่าคงที่แต่ละค่าสามารถจัดเตรียมการทำงานของเมธอดนามธรรมที่ประกาศไว้ในเนื้อหาของชนิดแจงนับได้เอง
enum Operation {
PLUS { public double apply(double x, double y) { return x + y; } },
MINUS { public double apply(double x, double y) { return x - y; } },
TIMES { public double apply(double x, double y) { return x * y; } },
DIVIDE{ public double apply(double x, double y) { return x / y; } };
public abstract double apply(double x, double y);
}
System.out.println(Operation.PLUS.apply(3, 4)); // 7.0
System.out.println(Operation.TIMES.apply(3, 4)); // 12.0ชนิดแจงนับที่มีป้ายกำกับเป็นสตริง
รูปแบบที่ใช้กันทั่วไปคือ ให้ค่าคงที่แต่ละค่ามีป้ายกำกับที่มนุษย์อ่านเข้าใจได้และจัดเก็บไว้ในฟิลด์
enum UserRole {
GUEST("Guest User"),
MEMBER("Registered Member"),
ADMIN("Administrator"),
SUPERADMIN("Super Administrator");
private final String label;
UserRole(String label) { this.label = label; }
public String label() { return label; }
public static UserRole fromLabel(String lbl) {
for (UserRole r : values())
if (r.label.equalsIgnoreCase(lbl)) return r;
throw new IllegalArgumentException(lbl);
}
}
System.out.println(UserRole.ADMIN.label()); // Administratorชนิดแจงนับที่มีหลายฟิลด์
ชนิดแจงนับสามารถมีฟิลด์ได้มากเท่าที่จำเป็น ในตัวอย่างนี้ ชนิดแจงนับสกุลเงินจัดเก็บทั้งรหัส ISO และสัญลักษณ์
enum Currency {
USD("US Dollar", "$"),
EUR("Euro", "\u20ac"),
GBP("British Pound", "\u00a3"),
JPY("Japanese Yen", "\u00a5");
public final String name;
public final String symbol;
Currency(String name, String symbol) {
this.name = name;
this.symbol = symbol;
}
public String format(double amount) {
return String.format("%s%.2f", symbol, amount);
}
}
System.out.println(Currency.EUR.format(99.99)); // \u20ac99.99การเขียนทับ toString()
เขียนทับ toString() ในชนิดแจงนับเพื่อคืนค่าการแทนสตริงแบบกำหนดเอง แทนการคืนชื่อค่าคงที่
enum HttpMethod {
GET, POST, PUT, PATCH, DELETE;
@Override
public String toString() {
return name().toUpperCase();
}
public boolean hasBody() {
return this == POST || this == PUT || this == PATCH;
}
}
HttpMethod m = HttpMethod.POST;
System.out.println(m); // POST
System.out.println(m.hasBody()); // true
System.out.println(HttpMethod.GET.hasBody()); // falseชนิดแจงนับพร้อมการตรวจสอบ
ตัวสร้างของชนิดแจงนับสามารถตรวจสอบอาร์กิวเมนต์เพื่อป้องกันสถานะที่ไม่ถูกต้องได้
enum DiscountTier {
BRONZE(5), SILVER(10), GOLD(20), PLATINUM(30);
public final int percentage;
DiscountTier(int percentage) {
if (percentage < 0 || percentage > 100)
throw new IllegalArgumentException("Invalid: " + percentage);
this.percentage = percentage;
}
public double apply(double price) {
return price * (1 - percentage / 100.0);
}
}
System.out.println(DiscountTier.GOLD.apply(100.0)); // 80.0รูปแบบอินสแตนซ์เดียวด้วยชนิดแจงนับ
ชนิดแจงนับที่มีค่าคงที่เพียงค่าเดียวเป็นวิธีที่ปลอดภัยที่สุดในการสร้างอินสแตนซ์เดียวใน Java เพราะปลอดภัยต่อการทำให้เป็นอนุกรมและปลอดภัยต่อการทำงานหลายเธรดโดยค่าเริ่มต้น
enum AppConfig {
INSTANCE;
private String dbUrl = "jdbc:postgresql://localhost/mydb";
private int maxConnections = 20;
public String getDbUrl() { return dbUrl; }
public int getMaxConnections() { return maxConnections; }
public void setDbUrl(String url) { this.dbUrl = url; }
}
// Access the singleton
AppConfig config = AppConfig.INSTANCE;
System.out.println(config.getDbUrl());ชนิดแจงนับในแบบจำลองโดเมน
มีการใช้ชนิดแจงนับอย่างแพร่หลายในแบบจำลองโดเมนเพื่อแทนหมวดหมู่ที่ปลอดภัยด้านชนิดข้อมูล เช่น สถานะคำสั่งซื้อ วิธีการชำระเงิน และชนิดการแจ้งเตือน เป็นต้น
enum PaymentMethod {
CREDIT_CARD("Credit Card", true),
DEBIT_CARD("Debit Card", true),
PAYPAL("PayPal", false),
CRYPTO("Cryptocurrency", false),
BANK_TRANSFER("Bank Transfer", false);
public final String displayName;
public final boolean instantCharge;
PaymentMethod(String displayName, boolean instantCharge) {
this.displayName = displayName;
this.instantCharge = instantCharge;
}
}ฟิลด์ของชนิดแจงนับเทียบกับค่าที่คำนวณ
ฟิลด์ใช้จัดเก็บข้อมูลตายตัว ส่วนเมธอดใช้คำนวณค่าแบบไดนามิก ใช้ฟิลด์สำหรับข้อมูลคงที่ และใช้เมธอดสำหรับค่าที่ได้จากการคำนวณ
enum DayType {
MONDAY(false), TUESDAY(false), WEDNESDAY(false),
THURSDAY(false), FRIDAY(false),
SATURDAY(true), SUNDAY(true);
private final boolean weekend;
DayType(boolean weekend) { this.weekend = weekend; }
public boolean isWeekend() { return weekend; }
public boolean isWeekday() { return !weekend; }
public static long weekdayCount() {
return java.util.Arrays.stream(values())
.filter(DayType::isWeekday).count();
}
}
System.out.println(DayType.weekdayCount()); // 5ตรวจสอบอย่างรวดเร็ว
ตัวสร้างของชนิดแจงนับแตกต่างจากตัวสร้างของคลาสทั่วไปอย่างไร
ทบทวน: ชนิดแจงนับที่มีฟิลด์และเมธอด
ประเด็นสำคัญ:
- เพิ่มฟิลด์และตัวสร้างเพื่อเก็บข้อมูลสำหรับค่าคงที่แต่ละค่า
- ตัวสร้างของชนิดแจงนับจะเป็น private โดยปริยาย
- เมธอดนามธรรมช่วยให้ค่าคงที่แต่ละค่าจัดเตรียมการทำงานของตนเองได้
- เขียนทับ toString() เพื่อกำหนดชื่อที่แสดงเอง
- ชนิดแจงนับที่มีค่าคงที่เพียงค่าเดียวเป็นการนำรูปแบบอินสแตนซ์เดียวไปใช้ที่ดีที่สุด
- ชนิดแจงนับผสานเข้ากับแบบจำลองโดเมนได้อย่างเป็นธรรมชาติในฐานะหมวดหมู่ที่ปลอดภัยด้านชนิดข้อมูล
คำถามที่พบบ่อย
บทเรียน “Enum ที่มีฟิลด์และเมธอด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Enum ที่มีฟิลด์และเมธอด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Enum ที่มีฟิลด์และเมธอด”
เพิ่มฟิลด์ ตัวสร้าง และเมธอดให้ enum เพื่อห่อหุ้มพฤติกรรม คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “Enum ที่มีฟิลด์และเมธอด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดและใช้งาน Enum
- Enum ที่มีฟิลด์และเมธอด
- นิพจน์ Switch กับ Enum
- EnumSet และ EnumMap