Varsayılan olmadan kapsamlı switch
Derleyici tüm sealed alt türlerin kapsandığını doğrular — default gerekmez.
Kod Karşılaştırması
✕ Java 8
// Must add default even though
// all cases are covered
double area(Shape s) {
if (s instanceof Circle c)
return Math.PI * c.r() * c.r();
else if (s instanceof Rect r)
return r.w() * r.h();
else throw new IAE();
}
✓ Java 21+
// sealed Shape permits Circle, Rect
double area(Shape s) {
return switch (s) {
case Circle c ->
Math.PI * c.r() * c.r();
case Rect r ->
r.w() * r.h();
}; // no default needed!
}
Bu kodda bir sorun mu gördünüz? Bize bildirin.
Modern yöntem neden daha iyi
Derleme zamanı güvenliği
Yeni bir alt tür ekleyin ve derleyici güncellenecek her yeri gösterir.
Ölü kod yok
Hataları gizleyen erişilemeyen varsayılan dal yoktur.
Cebirsel türler
sealed + record'lar + kapsamlı switch = Java'da uygun ADT'ler.
Eski Yaklaşım
Zorunlu default
Modern Yaklaşım
sealed Kapsamlılığı
JDK'dan itibaren
21
Zorluk
Orta
JDK Desteği
Varsayılan olmadan kapsamlı switch
Mevcut
JDK 21 LTS'den itibaren geniş çapta kullanılabilir (Eylül 2023)
Nasıl çalışır
Sealed bir türde switch kullandığınızda, derleyici tüm olası alt türleri bilir ve her durumun işlendiğini doğrular. Yeni bir alt tür eklerseniz, derleyici artık eksik olan her switch'i işaretler.
İlgili Belgeler