0Pricing
Java Academy · Ders

Enum'larda Soyut Yöntemler

Sabit başına davranış

Enum'larda Soyut Yöntemler, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Sabite Özgü Davranış

Bazen her numaralandırma türü sabiti yalnızca farklı verilere değil, farklı davranışa da ihtiyaç duyar.

Java, numaralandırma türünde bir soyut yöntem bildirmenize ve bu yöntemi her sabit için geçersiz kılmanıza olanak tanır. Bu, sabite özgü yöntem gövdesi kalıbıdır.

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));
    }
}

Nasıl Çalışır

Gövde içeren her sabit, numaralandırma türünün bir anonim alt sınıfı olur.

Soyut yöntem, her sabitin bir uygulama sağlamasını zorunlu kılar; böylece derleyici bütünlüğü garanti eder.

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));
    }
}

Eksiksiz Bir Hesap Makinesi

Dört aritmetik işlem sabit olarak tanımlanır ve her birinin kendine ait apply gövdesi vardır.

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));
        }
    }
}

Alanları ve Davranışı Birleştirme

Bir alanı (bir simgeyi) sabite özgü davranışla birleştirebilirsiniz. Alan işlemi etiketler; yöntem ise işlemi gerçekleştirir.

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));
    }
}

Neden Bir Seçim Yapısı Kullanılmamalı?

apply yöntemini sabit üzerinde tek bir seçim yapısı kullanarak uygulayabilirsiniz; ancak soyut yöntem yaklaşımı daha güvenlidir.

Daha sonra bir sabit eklerseniz derleyici, bu sabit için bir gövde sağlamanızı zorunlu kılar. Bir seçim yapısı ise yeni durumu sessizce atlayabilir.

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));
    }
}

Soyut Yöntemlerin Yanında Somut Yöntemler

Bir numaralandırma türü soyut ve somut yöntemleri birlikte barındırabilir. Ortak mantığı somut bir yönteme, değişen mantığı ise soyut yönteme koyun.

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));
    }
}

Strateji Numaralandırma Türleri

Bu yaklaşımın bir geliştirmesi strateji numaralandırma türüdür: sabitler doğrudan geçersiz kılmak yerine iç içe bir strateji numaralandırma türüne yetki verir.

Bu, birkaç sabit aynı davranışı paylaştığında kullanışlıdır. Burada hafta içi ve hafta sonu günleri ücret hesaplamasında farklılık gösterir.

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));
    }
}

Arayüz ve Gövdeler İçeren Numaralandırma Türü

En yüksek çok biçimlilik için bir arayüzü sabite özgü gövdelerle birleştirin.

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());
    }
}

Gövdelerden Alanlara Erişme

Sabite özgü bir gövde, o sabitin kendi alanlarını okuyabilir; çünkü her gövde ilgili örneğin bağlamında çalışır.

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));
    }
}

Önce Varsayılan, Sonra Geçersiz Kılma

Numaralandırma türünün gövdesinde somut bir varsayılan tanımlayabilir ve yalnızca farklı davranan sabitler için bunu geçersiz kılabilirsiniz.

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"));
    }
}

Küçük Bir Durum Makinesi

Sabite özgü davranış, durum makinelerinde özellikle etkilidir: her durum kendi geçişini bilir.

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);
    }
}

Hızlı Kontrol

Soyut numaralandırma türü yöntemleri hakkındaki anlayışınızı sınayın.

Özet

Sabite özgü davranışı öğrendiniz:

  • Bir soyut yöntem bildirin ve bu yöntemi her sabitin gövdesinde geçersiz kılın.
  • Her sabit bir anonim alt sınıf olur.
  • Derleyici bütünlüğü zorunlu kılar; bu yaklaşım bir seçim yapısından daha güvenlidir.
  • Zengin numaralandırma türleri için alanları, somut varsayılanları ve arayüzleri birleştirin.

Sırada yüksek performanslı EnumSet var.

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());
    }
}

Sıkça Sorulan Sorular

“Enum'larda Soyut Yöntemler” dersi ücretsiz mi?

Evet — “Enum'larda Soyut Yöntemler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Enum'larda Soyut Yöntemler” dersinde ne öğreneceğim?

Sabit başına davranış Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Enum'larda Soyut Yöntemler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Alan ve Yöntem İçeren Enum'lar
  2. Enum'larda Soyut Yöntemler
  3. EnumSet
  4. EnumMap
← Java Academy Sayfasına Dön