Bu yazıda, Sealed sınıfını, nasıl oluşturulduğunu ve ne zaman kullanılacağını örnekler yardımıyla öğreneceksiniz.
Mühürlenmiş sınıflar, bir değer sınırlı bir kümedeki türlerden yalnızca birine sahip olduğunda (sınırlı hiyerarşiler) kullanılır.
Mühürlü sınıflarla ilgili ayrıntılara girmeden önce, hangi sorunu çözdüklerini inceleyelim. Bir örnek alalım (resmi Kotlin web sitesinden alınmıştır - Mühürlü sınıflar makalesi):
class Expr class Const(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) else -> throw IllegalArgumentException("Unknown expression") )
Yukarıdaki programda, temel sınıf Expr iki türetilmiş sınıfa sahiptir Const (bir sayıyı temsil eder) ve Sum (iki ifadenin toplamını temsil eder). Burada, else
ifade ederken varsayılan koşul için dal kullanılması zorunludur .
Şimdi, Expr
sınıftan yeni bir alt sınıf türetirseniz , derleyici else
onu işlediği için hatalara yol açabilecek hiçbir şey algılamayacaktır . Yeni bir alt sınıf eklediğimizde derleyicinin bir hata vermesi daha iyi olurdu.
Bu sorunu çözmek için mühürlü sınıf kullanabilirsiniz. Belirtildiği gibi, mühürlenmiş sınıf, alt sınıflar oluşturma olasılığını sınırlar. Ve bir when
ifadede mühürlenmiş bir sınıfın tüm alt sınıflarını işlediğinizde, else
dal kullanmak gerekli değildir .
Mühürlü bir sınıf oluşturmak için mühürlü değiştirici kullanılır. Örneğin,
mühürlü sınıf İfade
Örnek: Mühürlü Sınıf
Mühürlü sınıfı kullanarak yukarıdaki sorunu nasıl çözebileceğiniz aşağıda açıklanmıştır:
sealed class Expr class Const(val value: Int) : Expr() class Sum(val left: Expr, val right: Expr) : Expr() object NotANumber : Expr() fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) NotANumber -> java.lang.Double.NaN )
Gördüğünüz gibi, else
şube yok . Sınıftan yeni bir alt Expr
sınıf türeterseniz, alt sınıf when
ifadede işlenmedikçe derleyici şikayet eder.
Birkaç Önemli Not
- Mühürlü bir sınıfın tüm alt sınıfları, mühürlenmiş sınıfın beyan edildiği aynı dosyada beyan edilmelidir.
- Mühürlenmiş bir sınıf kendi başına soyuttur ve ondan nesneleri başlatamazsınız.
- Mühürlü bir sınıfın özel olmayan yapıcılarını oluşturamazsınız; kurucuları
private
varsayılan olarak.
Enum ve Mühürlü Sınıf Arasındaki Fark
Enum sınıfı ve mühürlü sınıf oldukça benzer. Bir enum türü için değerler kümesi de mühürlenmiş bir sınıf gibi sınırlandırılmıştır.
Tek fark, enum yalnızca tek bir örneğe sahip olabilirken, mühürlenmiş bir sınıfın bir alt sınıfının birden çok örneğe sahip olabilmesidir.