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

อีนัมที่มีฟิลด์และเมธอด

เพิ่มพฤติกรรมให้อีนัม

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

ชนิดแจกแจงเป็นคลาสที่สมบูรณ์

ชนิดแจกแจงของ Java enum เป็นมากกว่ารายการค่าคงที่อย่างมาก แต่เป็นคลาสจริงที่มีอินสแตนซ์เป็นค่าคงที่เหล่านั้น

นั่นหมายความว่าชนิดแจกแจงสามารถมีฟิลด์ ตัวสร้าง และเมธอดได้เช่นเดียวกับคลาสอื่น ๆ

public class Main {
    enum Direction { NORTH, SOUTH, EAST, WEST }
    public static void main(String[] args) {
        Direction d = Direction.NORTH;
        System.out.println(d + " is a " + d.getClass().getSuperclass().getSimpleName());
    }
}

การเพิ่มฟิลด์

คุณสามารถแนบข้อมูลเข้ากับค่าคงที่แต่ละค่าได้ ให้ประกาศฟิลด์ final และตัวสร้าง จากนั้นส่งค่าในวงเล็บหลังค่าคงที่แต่ละตัว

public class Main {
    enum Planet {
        EARTH(9.81), MARS(3.71), JUPITER(24.79);
        private final double gravity;
        Planet(double gravity) { this.gravity = gravity; }
        double gravity() { return gravity; }
    }
    public static void main(String[] args) {
        System.out.println("Mars gravity: " + Planet.MARS.gravity());
    }
}

ตัวสร้างของชนิดแจกแจงเป็นแบบส่วนตัว

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

สิ่งนี้รับรองว่าจะมีอินสแตนซ์อยู่ในชุดที่ตายตัวและมีจำนวนจำกัด

public class Main {
    enum Coin {
        PENNY(1), NICKEL(5), DIME(10), QUARTER(25);
        private final int cents;
        Coin(int cents) { this.cents = cents; }
        int cents() { return cents; }
    }
    public static void main(String[] args) {
        int total = Coin.QUARTER.cents() + Coin.DIME.cents();
        System.out.println("Total cents: " + total);
    }
}

หลายฟิลด์

ค่าคงที่หนึ่งค่ามีข้อมูลได้หลายส่วน ในที่นี้ดาวเคราะห์แต่ละดวงเก็บทั้งมวลและรัศมี

public class Main {
    enum Planet {
        EARTH(5.976e24, 6.37814e6),
        MARS(6.421e23, 3.3972e6);
        private final double mass, radius;
        Planet(double mass, double radius) { this.mass = mass; this.radius = radius; }
        double surfaceGravity() {
            final double G = 6.67300E-11;
            return G * mass / (radius * radius);
        }
    }
    public static void main(String[] args) {
        System.out.printf("Earth g = %.2f%n", Planet.EARTH.surfaceGravity());
    }
}

เมธอดของอินสแตนซ์

เมธอดของชนิดแจกแจงสามารถคำนวณผลลัพธ์จากฟิลด์ของค่าคงที่นั้นเองได้ เช่นเดียวกับเมธอดของอินสแตนซ์ทั่วไป

public class Main {
    enum Size {
        SMALL(8), MEDIUM(12), LARGE(16);
        private final int ounces;
        Size(int ounces) { this.ounces = ounces; }
        int ounces() { return ounces; }
        double liters() { return ounces * 0.0295735; }
    }
    public static void main(String[] args) {
        System.out.printf("Large = %.2f L%n", Size.LARGE.liters());
    }
}

ชื่อที่มีมาในตัวและลำดับ

อีนัมทุกตัวจะได้รับ name() (ตัวระบุที่ตรงกันทุกประการ) และ ordinal() (ตำแหน่งที่เริ่มนับจากศูนย์)

ควรเก็บข้อมูลของคุณเองแทนการพึ่งพา ordinal() ซึ่งจะใช้งานไม่ได้หากคุณจัดลำดับค่าคงที่ใหม่

public class Main {
    enum Day { MON, TUE, WED }
    public static void main(String[] args) {
        for (Day d : Day.values()) {
            System.out.println(d.name() + " -> ordinal " + d.ordinal());
        }
    }
}

values และ valueOf

คอมไพเลอร์สร้างเมธอดช่วยแบบคงที่สองตัว:

  • values() จะส่งคืนอาร์เรย์ของค่าคงที่ทั้งหมด
  • valueOf(String) ค้นหาค่าคงที่ตามชื่อ และจะโยนข้อยกเว้นหากไม่พบ
public class Main {
    enum Status { ACTIVE, PAUSED, CLOSED }
    public static void main(String[] args) {
        System.out.println("count: " + Status.values().length);
        Status s = Status.valueOf("PAUSED");
        System.out.println("parsed: " + s);
    }
}

การเขียนทับ toString

คุณสามารถเขียนทับ toString() เพื่อกำหนดป้ายกำกับที่อ่านเข้าใจง่ายขึ้น โดยยังคงใช้ชื่อค่าคงที่ในโค้ดได้

public class Main {
    enum Priority {
        LOW, MEDIUM, HIGH;
        @Override public String toString() {
            return name().charAt(0) + name().substring(1).toLowerCase();
        }
    }
    public static void main(String[] args) {
        for (Priority p : Priority.values()) System.out.println(p);
    }
}

อีนัมในคำสั่งสวิตช์

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

public class Main {
    enum Traffic { RED, YELLOW, GREEN }
    static String action(Traffic t) {
        return switch (t) {
            case RED -> "Stop";
            case YELLOW -> "Slow down";
            case GREEN -> "Go";
        };
    }
    public static void main(String[] args) {
        System.out.println(action(Traffic.GREEN));
    }
}

แมปการค้นหาแบบคงที่

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

import java.util.HashMap;
import java.util.Map;

public class Main {
    enum Op {
        PLUS("+"), MINUS("-");
        private final String symbol;
        Op(String symbol) { this.symbol = symbol; }
        private static final Map<String, Op> BY_SYMBOL = new HashMap<>();
        static { for (Op o : values()) BY_SYMBOL.put(o.symbol, o); }
        static Op fromSymbol(String s) { return BY_SYMBOL.get(s); }
    }
    public static void main(String[] args) {
        System.out.println(Op.fromSymbol("-"));
    }
}

อีนัมใช้อินเทอร์เฟซ

อีนัมสามารถใช้อินเทอร์เฟซได้ ทำให้ค่าคงที่ต่าง ๆ เชื่อมต่อเข้ากับโค้ดทั่วไปได้

public class Main {
    interface Describable { String describe(); }
    enum Animal implements Describable {
        DOG, CAT;
        public String describe() { return "A " + name().toLowerCase(); }
    }
    public static void main(String[] args) {
        Describable d = Animal.DOG;
        System.out.println(d.describe());
    }
}

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจของคุณเกี่ยวกับฟิลด์ของอีนัม

ทบทวน

คุณได้เรียนรู้ว่าอีนัมเป็นคลาสที่สมบูรณ์:

  • ค่าคงที่สามารถเก็บฟิลด์ที่กำหนดผ่านตัวสร้างส่วนตัวได้
  • อีนัมมีเมธอดของอินสแตนซ์และเขียนทับ toString() ได้
  • values() และ valueOf() ถูกสร้างให้โดยอัตโนมัติ
  • อีนัมสามารถใช้อินเทอร์เฟซ และควรเลือกใช้ฟิลด์แทน ordinal()

ถัดไป พบกับพฤติกรรมเฉพาะค่าคงที่โดยใช้เมธอดนามธรรม

public class Main {
    enum Greeting { HELLO; String text() { return "Hi"; } }
    public static void main(String[] args) {
        System.out.println("Enum fields recap: " + Greeting.HELLO.text());
    }
}

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

บทเรียน “อีนัมที่มีฟิลด์และเมธอด” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “อีนัมที่มีฟิลด์และเมธอด”

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

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

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

บทเรียน “อีนัมที่มีฟิลด์และเมธอด” ใช้เวลานานแค่ไหน

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

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

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

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

  1. อีนัมที่มีฟิลด์และเมธอด
  2. เมธอดนามธรรมในอีนัม
  3. EnumSet
  4. EnumMap
← กลับไปที่ Java Academy