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

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

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

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