Sealed Hiyerarşilerle Eksiksiz when
Her sealed çeşidini kapsayan eksiksiz when ifadeleri yazın.
Sealed Hiyerarşilerle Eksiksiz when, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 2. 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, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.
Tüm Olasılıkları Kapsayan when
İfade olarak kullanılan bir when ifadesi tüm olasılıkları kapsamalıdır — her olası değer ele alınmalıdır. Mühürlü hiyerarşiler, derleyicinin bunu sizin için doğrulamasını sağlar.
Açık Türde Tüm Olasılıkları Kapsamayan when
Sıradan sınıflarda derleyici tüm alt türleri denetleyemez — bir else dalı gerektirir.
open class Shape
class Circle : Shape()
class Square : Shape()
fun describe(s: Shape) = when (s) {
is Circle -> "circle"
is Square -> "square"
else -> "unknown" // required
}
fun main() { println(describe(Circle())) }Mühürlü Türde Tüm Olasılıkları Kapsayan when
Mühürlü bir sınıf için derleyici tüm alt türleri bilir. Her durum ele alınıyorsa else gerekmez.
sealed class Result
class Success(val value: Int) : Result()
class Failure(val msg: String) : Result()
fun describe(r: Result) = when (r) {
is Success -> "ok: ${r.value}"
is Failure -> "err: ${r.msg}"
}
fun main() {
println(describe(Success(42)))
println(describe(Failure("nope")))
}Mühürlü Arayüz
Mühürlü arayüzler, sınıfların çoklu kalıtıma ihtiyaç duyduğu durumlarda bile tüm olasılıkların denetlenmesini sağlar.
sealed interface Animal
class Dog : Animal
class Cat : Animal
fun speak(a: Animal) = when (a) {
is Dog -> "woof"
is Cat -> "meow"
}
fun main() {
println(speak(Dog()))
println(speak(Cat()))
}Dallardaki Akıllı Tür Dönüşümleri
Her is dalının içinde Kotlin, değişkeni belirli türe otomatik olarak dönüştürür — elle tür dönüşümü yapmanız gerekmez.
sealed class Event
data class Click(val x: Int, val y: Int) : Event()
data class Key(val char: Char) : Event()
fun handle(e: Event) = when (e) {
is Click -> "clicked at (${e.x},${e.y})" // smart-cast
is Key -> "key=${e.char}"
}
fun main() {
println(handle(Click(10, 20)))
println(handle(Key('A')))
}Bir Durumu Unutmak
Daha sonra yeni bir varyant eklerseniz, mühürlü türü hâlâ ifade olarak kullanan tüm olasılıkları kapsayan when ifadeleri derlenemez — bu harika bir güvenlik ağıdır.
sealed class Status
object Idle : Status()
object Running : Status()
// If we add object Done : Status(), every exhaustive when must update.
fun text(s: Status): String = when (s) {
is Idle -> "idle"
is Running -> "running"
}
fun main() { println(text(Idle)) }Veri Sınıflarıyla Mühürlü Türler
Yaygın kalıp: mühürlü bir hiyerarşinin varyantları olarak veri sınıflarını kullanmak.
sealed class UiState {
object Loading : UiState()
data class Success(val data: List<String>) : UiState()
data class Error(val message: String) : UiState()
}
fun render(state: UiState) = when (state) {
UiState.Loading -> "loading..."
is UiState.Success -> "got ${state.data.size} items"
is UiState.Error -> "error: ${state.message}"
}
fun main() {
println(render(UiState.Loading))
println(render(UiState.Success(listOf("a", "b"))))
println(render(UiState.Error("404")))
}when İfadesini Deyim Olarak Kullanma
Deyim olarak (ifade olarak değil) kullanıldığında when ifadesinin tüm olasılıkları kapsaması gerekmez. Ancak güvenlik ağından vazgeçmiş olursunuz.
sealed class Cmd
object Start : Cmd()
object Stop : Cmd()
fun execute(c: Cmd) {
// Statement form: no error if incomplete (avoid this style)
when (c) {
Start -> println("started")
Stop -> println("stopped")
}
}
fun main() { execute(Start); execute(Stop) }Deyimlerde Tüm Olasılıkların Denetlenmesini Zorlama
when ifadesini bir değere atayın (veya .exhaustive yöntemini kullanın); böylece derleyici tüm durumların ele alınmasını zorunlu kılar.
sealed class Cmd
object Start : Cmd()
object Stop : Cmd()
fun execute(c: Cmd) {
val handled: Unit = when (c) { // expression context now
Start -> println("started")
Stop -> println("stopped")
}
}
fun main() { execute(Start) }Çok Durumlu Dallar
Birden fazla varyantta aynı gövdeyi paylaşmak için durumları virgüllerle gruplayın.
sealed class Event
class Click : Event()
class Tap : Event()
class Drag : Event()
fun isPointer(e: Event) = when (e) {
is Click, is Tap, is Drag -> true
}
fun main() { println(isPointer(Tap())) }İç İçe Mühürlü Türler
Mühürlü hiyerarşiler iç içe olabilir — tüm olasılıkların denetlenmesi derin ağaçlarda da çalışır.
sealed class Network {
sealed class Wifi : Network() {
object Open : Wifi()
data class Secured(val ssid: String) : Wifi()
}
object Cellular : Network()
}
fun describe(n: Network) = when (n) {
Network.Wifi.Open -> "open wifi"
is Network.Wifi.Secured -> "secured: ${n.ssid}"
Network.Cellular -> "cellular"
}
fun main() {
println(describe(Network.Wifi.Secured("home")))
println(describe(Network.Cellular))
}Kısa Kontrol
Mühürlü hiyerarşilerle when kullanmanın temel faydası nedir?
Özet
Derleme zamanında tüm olasılıkların denetlenmesi için mühürlü sınıfları/arayüzleri when ile eşleştirin. Akıllı tür dönüşümleri dal gövdelerini basitleştirir. Denetimi zorlamak için ifade olarak kullanın (veya sonucu atayın); durumları virgüllerle gruplayın; ağaç biçimli durumlar için mühürlü türleri iç içe yerleştirin.
Sıkça Sorulan Sorular
“Sealed Hiyerarşilerle Eksiksiz when” dersi ücretsiz mi?
Evet — “Sealed Hiyerarşilerle Eksiksiz when” 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 Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.
“Sealed Hiyerarşilerle Eksiksiz when” dersinde ne öğreneceğim?
Her sealed çeşidini kapsayan eksiksiz when ifadeleri yazın. Kotlin 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.
Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Kotlin 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 2. dersidir.
“Sealed Hiyerarşilerle Eksiksiz when” 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 Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Kotlin 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
- sealed class ve sealed interface: Hangisi Ne Zaman Kullanılır
- Sealed Hiyerarşilerle Eksiksiz when
- Sealed Sınıflarla Kullanıcı Arayüzü Durumlarını Modelleme
- Sealed Hiyerarşileri İç İçe Yerleştirme ve Birleştirme