Java Academy · Ders

Mühürlü Türlerde Eksiksiz switch

Derleme zamanında eksiksizlik

4. ders / 413 adım

Mühürlü Türlerde Eksiksiz switch, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. 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.

Eksiksiz Seçim Yapısı

Mühürlü bir tür üzerinde switch kullandığınızda derleyici izin verilen her alt türü bilir. Hepsini ele alırsanız seçim yapısı eksiksiz olur ve varsayılan bir dala ihtiyaç duymazsınız.

Tür Desenli Seçim Yapısı

Seçim ifadeleri, tür örüntülerini kullanarak mühürlü bir değerin çalışma zamanındaki türüyle eşleşebilir.

public class Main {
    sealed interface Shape permits Circle, Square {}
    record Circle(double radius) implements Shape {}
    record Square(double side) implements Shape {}

    static String describe(Shape s) {
        return switch (s) {
            case Circle c -> "circle r=" + c.radius();
            case Square sq -> "square s=" + sq.side();
        };
    }

    public static void main(String[] args) {
        System.out.println(describe(new Circle(2)));
        System.out.println(describe(new Square(3)));
    }
}

Varsayılan Gerekmez

Circle ve Square izin verilen tek alt türler olduğu için derleyici seçim yapısının tamamlanmış olduğunu kabul eder. Bir default eklemek gereksiz olur.

Derleme Zamanında Eksiksizlik

Daha sonra yeni bir izin verilen alt tür eklerseniz ve onu ele almayı unutursanız tüm eksiksiz seçim yapıları derlenemez. Böylece çalışma zamanındaki birçok hata türü derleme hatasına dönüşür.

Bir Result Hesaplama

Eksiksiz seçim ifadeleri, bir değeri area gibi bir sonuca dönüştürmek için oldukça uygundur.

public class Main {
    sealed interface Shape permits Circle, Square {}
    record Circle(double radius) implements Shape {}
    record Square(double side) implements Shape {}

    static double area(Shape s) {
        return switch (s) {
            case Circle c -> Math.PI * c.radius() * c.radius();
            case Square sq -> sq.side() * sq.side();
        };
    }

    public static void main(String[] args) {
        System.out.printf("%.2f%n", area(new Circle(1)));
        System.out.printf("%.2f%n", area(new Square(2)));
    }
}

Seçim Deyimleri ve İfadeleri

Eksiksizlik, mühürlü bir tür üzerinde ok biçimini kullanan seçim ifadeleri ve seçim deyimleri için geçerlidir. Derleyici tüm durumların ele alınmasını zorunlu kılar.

Boş Değerleri İşleme

Varsayılan olarak bir başvuru üzerindeki seçim yapısı, değer boşsa NullPointerException fırlatır. Bunu açıkça ele almak için bir case null etiketi ekleyebilirsiniz.

public class Main {
    sealed interface Shape permits Circle, Square {}
    record Circle(double radius) implements Shape {}
    record Square(double side) implements Shape {}

    static String describe(Shape s) {
        return switch (s) {
            case null -> "no shape";
            case Circle c -> "circle";
            case Square sq -> "square";
        };
    }

    public static void main(String[] args) {
        System.out.println(describe(null));
        System.out.println(describe(new Circle(1)));
    }
}

Korumalar Eksiksizliği Bozmaz

Durumları daha da özelleştirmek için when korumaları ekleyebilirsiniz; ancak tek başına korumalı bir durum, türün ele alındığı anlamına gelmez. Eksiksizliği korumak için her alt tür adına korumasız bir duruma yine ihtiyaç duyarsınız.

public class Main {
    sealed interface Shape permits Circle, Square {}
    record Circle(double radius) implements Shape {}
    record Square(double side) implements Shape {}

    static String size(Shape s) {
        return switch (s) {
            case Circle c when c.radius() > 10 -> "big circle";
            case Circle c -> "small circle";
            case Square sq -> "square";
        };
    }

    public static void main(String[] args) {
        System.out.println(size(new Circle(20)));
        System.out.println(size(new Circle(2)));
    }
}

Mühürlü Bir Sınıf Üzerinde Seçim Yapısı

Aynı eksiksizlik, yalnızca arayüzlerde değil, mühürlü sınıflarda da geçerlidir.

public class Main {
    sealed static abstract class Token permits Word, Number {}
    static final class Word extends Token { final String text; Word(String t){text=t;} }
    static final class Number extends Token { final int value; Number(int v){value=v;} }

    static String show(Token t) {
        return switch (t) {
            case Word w -> "word:" + w.text;
            case Number n -> "num:" + n.value;
        };
    }

    public static void main(String[] args) {
        System.out.println(show(new Word("hi")));
        System.out.println(show(new Number(7)));
    }
}

Neden Güçlüdür

Eksiksiz seçim yapısı ile mühürlü türler, güvenli ve geliştirilebilir kod elde etmenizi sağlar. Durum kümesi tek bir yerde belgelenir ve model büyüdüğünde hiçbir durumu atlamamanızı derleyici güvence altına alır.

Eksiksiz Bir Örnek

Burada mühürlü bir Result türü, tüm durumlar ele alınarak bir iletiye dönüştürülüyor.

public class Main {
    sealed interface Result permits Ok, Err {}
    record Ok(int value) implements Result {}
    record Err(String message) implements Result {}

    static String render(Result r) {
        return switch (r) {
            case Ok ok -> "value = " + ok.value();
            case Err err -> "error: " + err.message();
        };
    }

    public static void main(String[] args) {
        System.out.println(render(new Ok(10)));
        System.out.println(render(new Err("bad input")));
    }
}

Kısa Kontrol

Eksiksiz seçim yapısı konusundaki anlayışınızı sınayın.

Özet

Mühürlü türler üzerinde eksiksiz seçim yapısı kullanmayı öğrendiniz.

  • İzin verilen tüm alt türleri ele almak, seçim yapısını eksiksiz hâle getirir; bu nedenle default gerekmez.
  • Yeni bir alt türün atlanması derleme hatasına dönüşür.
  • case null, boş değerleri açıkça ele alır.
  • Korumalar durumları özelleştirir ancak korumasız bir durumun yerini tutmaz.
Başlamak ücretsiz

Yapay zeka eğitmeniyle Java öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
104
Dersler
374

Sıkça Sorulan Sorular

“Mühürlü Türlerde Eksiksiz switch” dersi ücretsiz mi?

Evet — “Mühürlü Türlerde Eksiksiz switch” 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.

“Mühürlü Türlerde Eksiksiz switch” dersinde ne öğreneceğim?

Derleme zamanında eksiksizlik 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 4. dersidir.

“Mühürlü Türlerde Eksiksiz switch” 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. Mühürlü Türleri Tanımlama
  2. permits Yan Tümcesi
  3. Record'larla Mühürlü Türler
  4. Mühürlü Türlerde Eksiksiz switch
← Java Academy Sayfasına Dön