Data/Enum/Sealed Class Nedir ?

Buse DEMİR
3 min readJul 20, 2022

--

Herkese Merhabalar !

Bugün Android - Kotlin de yer alan class çeşitlerini ele alarak minik örnekler ile inceleyeceğiz. Haydi Başlayalım !

Class Nedir ?

Sınıflar; bir olay, durum hakkındaki verileri barındıran yapılardır.Örneğin ; Kurabiye hakkında bir sınıf oluşturmak istiyorsak burada kurabiyeye ait olan verileri barındırırız. Bu veriler nedir ? Kurabiye çeşidi, ölçüsü, ürünleri, pişirme süresi .. gibi çoğaltabiliriz. Sınıf , metod ve özelliklerden oluşur. Özelliklikler değişken ve sabitlerden, metodlarda fonksiyonlardan meydana gelmiş diyebiliriz.

1 — Data Class

Data Class’lar verileri depolamak için kullanılan özel sınıflardır ve data anahtar sözcüğüyle tanımlanırlar.

Data Class’larda getter ve setter metotları, hashCode(), equals(), toString(), copy() metotları üretilir.

Data Class lar da en az bir tane parametre olmalıdır. Parametresiz data class tanımlayamayız. Amacımız zaten oluşturulan bu data class ile bir işlem yapabilmektir.

Data Class lar parametreleri val yada var olarak tanımlamamızı ister.

Data Class lar üzerinden başka bir sınıf olarak kalıtım alınamaz. Çünkü abstract, open ve inner değillerdir.

Data Class Nerelerde Kullanılır ?

  • Webe istek atarken
  • Webden yanıt alırken
  • Yerel veri tabanına kayıt yaparken
  • Genel bir class yapısında oluşturulan değişkenlerde sadece lazım olan değişkenleri çekmem gerektiğinde bir data class oluşturulur.

Data Class lara ait minik bir örneği ele alırsak ;

  • Çalışanlara ait yazılan data class içerisinde çalışan ismi ve maaşı yer almaktadır. Yani bizim data classa ait parametrelerimiz isim ve maaşdır.
data class Employee (val name: String, val wage: Int)

fun main() {
val employee = Employee("Buse", 20000)
println(employee)
}
  • Logcat de ise şöyle bir çıktı görürüz ;

2 — Enum Class

Bir durumun hallerini belirtmek için kullanılan temel sınıflardır. Bir durum halleri ne demek dersek , örneğin Network Durumlarını içeren bir enum class olduğunu düşünelim. Network Durumları derken -iyi-kötü-başarısız-başarılı-çokkötü .. gibi halleri var. Yani kullanıcıdan bize gelen bir aksiyon tipleri — durumun halleri — vardır. Bunları barındıran yapıya enum class denir.

Enum classların constructorları olabilir. Fakat dikkat edilmesi gereken konu belirtililen hallerede bu constructorları belirtmemiz gerek. Bu kullanım numaralandırma işlemlerinde kullanılabilir. Kod okunabilirliği açısından bu önemli bir noktadır.

Enum Class lar abstract, open, sealed, inner, data olamazlar.

Enum Class ları minik bir örnek ile ele alırsak ;

  • Günleri içeren bir enum class olduğunu varsayalım. Enum Class ile numaralandırma sayesinde günlere daha temiz yoldan ulaşabiliyoruz. Fakat bunun farklı ve karmaşık yöntemi tek tek PAZARTESİ=1 yapmak gibi yolu vardır. İyi gibi gözüksede her lazım olduğu zaman tek tek örneğin if sorgusunda yazmak uğraştırıcı olur.
  • Enum sayesinde bu kodu temiz hale getirebiliyoruz.
enum class Days(val id:Int){
SUNDAY(1),
MONDAY(2),
TUESDAY(3),
WEDNESDAY(4),
THURSDAY(5),
FRIDAY(6),
SATURDAY(7),
}
if (dayCode == Days.SUNDAY.id){
// SUNDAY
} else if (dayCode == Days.MONDAY.id){
// MONDAY
} ...
else {
// CODE IS INCORRECT }

3 — Sealed Class

Sealed classlar enum classların genişletilmiş halidir.

Enum classlar tek bir değişken tipine sahipken sealed classlar her bir durum için farklı değişken tiplerine sahip olabilir. Bu sayede sealed class lar enum class lara göre gerçekten büyük bir ayrımı oluşturmuş oluyor.

Yani sealed sayesinde ayrı data lara sahip olabiliyoruz. Sealed sayesinde alt tiplerini kendimiz belirleyip Sealed ile kalıtım alarak kendi verisini taşıma özgürlüğü sağlıyoruz.

  • Sealed Class ları minik bir örnek ile ele alırsak ;

Her daim kullanmış olduğumuz Web servisten veri geleceği zaman karşılaştığımız 3 durumu inceleyelim. Bu 3 durum içinde bizim farklı aksiyonları mevcuttur.

Bu 3 durumda neler olabilir ? Success olduğu zaman Success constructor ‘ında data ‘yı almalı , Error ve Loading için hiç bir veri almamalıdır.

sealed class Resource {
object Error : Resource()
object Loading : Resource()
data class Success(val data: Int ) : Resource()
}
fun getData(resource: Resource) {
when (resource) {
is Resource.Error -> {}
is Resource.Loading -> {}
is Resource.Success -> {
}
}
}

Eğer biz bu durumu enum classlarda tanımlamış olsaydık, veriler herhangi bir durum farketmeksizin gelirdi. Böylelikle de karmaşıklığa sebep olurdu. Sealed Class larda bu işlem daha temiz halledilir.

Enum class da 1 parametreyi tüm durumlar almalıyken , Sealed class da var olan durumu farklı verilere sahip olması şeklinde inceleyebiliyoruz.

Bir sonraki yazıda görüşmek üzeree ..

Kaynakça

--

--

Buse DEMİR

Hello, my name is Buse. I am a computer engineer. ❤️Love Android and Kotlin❤️. Just live..