0Pricing
Java Academy · Pelajaran

Method Abstrak dalam Enum

Perilaku untuk setiap konstanta.

Method Abstrak dalam Enum adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Perilaku per Konstanta

Terkadang setiap konstanta enumerasi memerlukan perilaku yang berbeda, bukan sekadar data yang berbeda.

Java memungkinkan Anda mendeklarasikan metode abstract pada enumerasi dan menimpanya untuk setiap konstanta. Ini adalah pola badan metode khusus konstanta.

public class Main {
    enum Operation {
        PLUS { public int apply(int a, int b) { return a + b; } },
        MINUS { public int apply(int a, int b) { return a - b; } };
        public abstract int apply(int a, int b);
    }
    public static void main(String[] args) {
        System.out.println(Operation.PLUS.apply(3, 4));
        System.out.println(Operation.MINUS.apply(10, 6));
    }
}

Cara Kerjanya

Setiap konstanta yang memiliki badan menjadi subkelas anonim dari enumerasi.

Metode abstract memaksa setiap konstanta menyediakan implementasi, sehingga kompilator menjamin kelengkapan.

public class Main {
    enum Operation {
        TIMES { public int apply(int a, int b) { return a * b; } };
        public abstract int apply(int a, int b);
    }
    public static void main(String[] args) {
        // The constant is an instance of a generated subclass
        System.out.println(Operation.TIMES.getClass().getSimpleName().isEmpty()
            ? "anonymous subclass" : Operation.TIMES.apply(6, 7));
    }
}

Kalkulator Lengkap

Empat operasi aritmetika sebagai konstanta, masing-masing dengan badan apply sendiri.

public class Main {
    enum Operation {
        PLUS  { public double apply(double a, double b) { return a + b; } },
        MINUS { public double apply(double a, double b) { return a - b; } },
        TIMES { public double apply(double a, double b) { return a * b; } },
        DIVIDE{ public double apply(double a, double b) { return a / b; } };
        public abstract double apply(double a, double b);
    }
    public static void main(String[] args) {
        double x = 6, y = 3;
        for (Operation op : Operation.values()) {
            System.out.printf("%s -> %.1f%n", op, op.apply(x, y));
        }
    }
}

Menggabungkan Anggota Data dan Perilaku

Anda dapat menggabungkan anggota data (simbol) dengan perilaku per konstanta. Anggota data memberi label pada operasi; metode menjalankannya.

public class Main {
    enum Operation {
        PLUS("+")  { public double apply(double a, double b) { return a + b; } },
        MINUS("-") { public double apply(double a, double b) { return a - b; } };
        private final String symbol;
        Operation(String symbol) { this.symbol = symbol; }
        public abstract double apply(double a, double b);
        @Override public String toString() { return symbol; }
    }
    public static void main(String[] args) {
        Operation op = Operation.PLUS;
        System.out.println("2 " + op + " 3 = " + op.apply(2, 3));
    }
}

Mengapa Bukan switch

Anda dapat mengimplementasikan apply dengan satu switch pada konstanta, tetapi pendekatan metode abstract lebih aman.

Jika Anda menambahkan konstanta nanti, kompilator memaksa Anda menyediakan badannya. Pernyataan switch dapat secara diam-diam melewatkan kasus baru tersebut.

public class Main {
    enum Op {
        SQUARE { public int apply(int n) { return n * n; } },
        CUBE   { public int apply(int n) { return n * n * n; } };
        public abstract int apply(int n);
    }
    public static void main(String[] args) {
        System.out.println(Op.SQUARE.apply(5));
        System.out.println(Op.CUBE.apply(3));
    }
}

Metode Konkret Bersama Metode Abstract

Enumerasi dapat menggabungkan metode abstract dan metode konkret. Logika yang sama ditempatkan dalam metode konkret; logika yang bervariasi tetap abstract.

public class Main {
    enum Shape {
        CIRCLE { public double area(double x) { return Math.PI * x * x; } },
        SQUARE { public double area(double x) { return x * x; } };
        public abstract double area(double x);
        public String report(double x) { return this + " area = " + area(x); }
    }
    public static void main(String[] args) {
        System.out.println(Shape.CIRCLE.report(2));
    }
}

Enumerasi Strategi

Penyempurnaannya adalah enumerasi strategi: konstanta mendelegasikan tugas ke enumerasi strategi bersarang, alih-alih menimpa perilaku secara langsung.

Ini berguna ketika beberapa konstanta memiliki perilaku yang sama. Di sini hari kerja dan akhir pekan berbeda dalam perhitungan pay.

public class Main {
    enum PayType {
        WEEKDAY { int overtime(int mins) { return mins; } },
        WEEKEND { int overtime(int mins) { return mins * 2; } };
        abstract int overtime(int mins);
        int pay(int mins) { return mins + overtime(Math.max(0, mins - 480)); }
    }
    public static void main(String[] args) {
        System.out.println("Weekend pay: " + PayType.WEEKEND.pay(540));
    }
}

Enumerasi dengan Antarmuka dan Badan

Gabungkan antarmuka dengan badan khusus konstanta untuk polimorfisme maksimum.

public class Main {
    interface Command { String run(); }
    enum Action implements Command {
        START { public String run() { return "starting..."; } },
        STOP  { public String run() { return "stopping..."; } };
    }
    public static void main(String[] args) {
        for (Action a : Action.values()) System.out.println(a.run());
    }
}

Mengakses Anggota Data dari Badan

Badan khusus konstanta dapat membaca anggota data milik konstanta itu sendiri, karena setiap badan berjalan dalam konteks instans tersebut.

public class Main {
    enum Tax {
        STANDARD(0.20) { double apply(double amt) { return amt * (1 + rate); } },
        REDUCED(0.05)  { double apply(double amt) { return amt * (1 + rate); } };
        protected final double rate;
        Tax(double rate) { this.rate = rate; }
        abstract double apply(double amt);
    }
    public static void main(String[] args) {
        System.out.printf("%.2f%n", Tax.STANDARD.apply(100));
    }
}

Bawaan lalu Penggantian

Anda dapat memberikan bawaan konkret di badan enumerasi dan menggantinya hanya untuk konstanta yang berbeda.

public class Main {
    enum Notifier {
        EMAIL,
        SMS { String send(String m) { return "SMS: " + m; } };
        String send(String m) { return "EMAIL: " + m; }
    }
    public static void main(String[] args) {
        System.out.println(Notifier.EMAIL.send("hi"));
        System.out.println(Notifier.SMS.send("hi"));
    }
}

Mesin State Mini

Perilaku per konstanta sangat berguna dalam mesin status: setiap status mengetahui transisinya sendiri.

public class Main {
    enum State {
        IDLE    { State next() { return RUNNING; } },
        RUNNING { State next() { return DONE; } },
        DONE    { State next() { return DONE; } };
        abstract State next();
    }
    public static void main(String[] args) {
        State s = State.IDLE;
        for (int i = 0; i < 3; i++) { System.out.println(s); s = s.next(); }
        System.out.println(s);
    }
}

Pemeriksaan Cepat

Uji pemahaman Anda tentang metode abstract pada enumerasi.

Ringkasan

Anda telah mempelajari perilaku per konstanta:

  • Deklarasikan metode abstract dan timpa metode tersebut dalam badan setiap konstanta.
  • Setiap konstanta menjadi subkelas anonim.
  • Kompilator menegakkan kelengkapan, sehingga lebih aman daripada switch.
  • Gabungkan anggota data, bawaan konkret, dan antarmuka untuk membuat enumerasi yang kaya fitur.

Berikutnya, EnumSet berperforma tinggi.

public class Main {
    enum E { A { int v() { return 1; } }; abstract int v(); }
    public static void main(String[] args) {
        System.out.println("Abstract enum recap: " + E.A.v());
    }
}

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Method Abstrak dalam Enum” gratis?

Ya — teks lengkap “Method Abstrak dalam Enum” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Method Abstrak dalam Enum”?

Perilaku untuk setiap konstanta. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Method Abstrak dalam Enum” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Enum dengan Field dan Method
  2. Method Abstrak dalam Enum
  3. EnumSet
  4. EnumMap
← Kembali ke Java Academy