Genel

Kotlin Enum ve Sealed Class Nedir ?

Merhabalar,

Bugünki dersimizde java ‘dan farklı bir özelliğe sahip olan kotlin ‘in gelişmiş enum özelliğini inceleyeceğiz.

Enum jdk 1.5 ile hayatımıza giren belirli değerlere karşılık gelen tanımlamalar için kullandığımız bir yapıdır. Kotlin ‘de de aynı durum mevcuttur.

Kod okunabilirliğini artırdığı içinde çokca tercih ediyoruz. Show me code 🙂

public class HaftaninGunleri {
    public static void print(int dayCode){
        if (dayCode == 1){ 
            // Pazartesi  yazdirma
        } else if (dayCode == 2){ 
            // Salı  yazdirma
        } ...
        else {
           // gün kod değeri hatalı        }
    }

Gerçek hayatta yukardaki kod ‘a benzer bi code var mıdır ? kesinlikle mevcuttur. Asıl soru bu kod sizce çok mu kalitelidir.

işte 1, 2 filan ‘ı belki sınıf değişkeni olarak tanımlayıp val PAZARTESI=1 filan derdik ee buda saçma ve başka bir sınıfta da böyle bir işleme ihtiyaç duyduğunuzda ne olacak ? Tekrar mı değişken tanımlayacaksınız ?

Cevap basit hayır. ENUM bizi bu sorunlardan kurtarıyor.

enum  HaftaninGUNLERI(val id:Int){
PAZARTERSI(1),SALI(2), ....,}
public class HaftaninGunleri {
    public  void print(int dayCode){
        if (dayCode == HaftaninGunleri.Pazartesi.id){ 
            // Pazartesi  yazdirma
        } else if (dayCode == HaftaninGunleri.Pazartesi.id){ 
            // Salı  yazdirma
        } ...
        else {
           // gün kod değeri hatalı        }
    }

Örnek sama olmamıştır umarım. Enum ‘u böylece hallettik.

Peki Sealed Class Nedir ?

Hadi bir örnek üzerinden anlatalım. En çok kullandığımız web servis için parse ettiğimiz retrofit’ten örnek verelim. Web servisten veri geleceği zaman bunu 3 durumda inceliyoruz. İlk olarak loading durumunda verinin gelmesi sonrasında ise ya veri fail olmuştur ya da başarılı olmuştur.

O zaman tanımlamamızı enum ile yaptık.

enum class Resource{
ERROR,
LOADING,
SUCCESS
}
fun getData(resource: Resource) {
    when(resource) {
        Resource.ERROR -> {  }
        Resource.LOADING -> {  }
        Resource.SUCCESS -> {  }
    }
}

veri tutma gibi bir olay yok. direk primitive tip olarak kontrolü yaptık.

yukardaki örnekte olduğu gibi id vs gibi bir değerde atayabilirdik. Ancak bu durumda şöyle bir sorunla karşı karşıya kalırdık. Veriler herhangi bir durum farketmeksizin gelirdi. İşte buna da bizim gönlümüz el vermezdi.

Ek olarak enum ‘da primitive tip tanımladık. Gelin inceleyelim sealed class ‘ı:

sealed class Resource {
    class Error : Resource()
    class Loading : Resource()
    data class Success(val data: Data) : Resource()
}

Yukarıdaki durumda neler oldu. Success constructor ‘ında data ‘yı alabildik. Error ve Loading için hiç bir veri almamıza gerek yok.

Performans olarak kotlindeki object keyword ‘ü signleton ‘a eşittir. Veri alınmadık durumları signleton olarak tanımlayabiliriz.

sealed class Resource {
    object Error : Resource()
    object Loading : Resource()
    data class Success(val data: Data) : Resource()
}

Hadi erişelim o zaman:

fun getData(resource: Resource) {
    when(resource) {
        is Resource.Error -> {  }
        is Resource.Loading -> {  }
        is Resource.Success -> {
      data class 'ı içerisindeki kullan burada.
        }
    }
}

İyi Okumalar 🙂

Kaynakça : //www.youtube.com/watch?v=OyIRuxjBORY

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir