{"id":35022,"date":"2025-11-24T23:41:00","date_gmt":"2025-11-24T20:41:00","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35022"},"modified":"2025-11-24T23:41:00","modified_gmt":"2025-11-24T20:41:00","slug":"kotlin-sealed-siniflar-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/","title":{"rendered":"Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<h2>Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber<\/h2>\n<p><body><\/p>\n<h2>Sealed S\u0131n\u0131flara Giri\u015f<\/h2>\n<p>Kotlin, modern yaz\u0131l\u0131m geli\u015ftirmenin ihtiya\u00e7lar\u0131na cevap veren g\u00fc\u00e7l\u00fc ve ifade edici bir dildir. Bu ihtiya\u00e7lardan biri de, belirli bir t\u00fcr hiyerar\u015fisini kapal\u0131 ve kontroll\u00fc bir \u015fekilde tan\u0131mlayabilmektir. \u0130\u015fte bu noktada Kotlin&#8217;in &#8220;sealed class&#8221; (m\u00fch\u00fcrl\u00fc s\u0131n\u0131f) \u00f6zelli\u011fi devreye girer. Sealed s\u0131n\u0131flar, bir s\u0131n\u0131f\u0131n alt s\u0131n\u0131flar\u0131n\u0131n say\u0131s\u0131n\u0131 ve t\u00fcr\u00fcn\u00fc derleme zaman\u0131nda k\u0131s\u0131tlamam\u0131z\u0131 sa\u011flayan \u00f6zel bir s\u0131n\u0131f t\u00fcr\u00fcd\u00fcr. Bu \u00f6zellik, \u00f6zellikle durumlar\u0131, olaylar\u0131 veya belirli bir veri setini temsil etmek i\u00e7in idealdir ve kodumuzun daha g\u00fcvenli, okunabilir ve bak\u0131m\u0131 kolay olmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Geleneksel olarak, Java gibi dillerde veya Kotlin&#8217;de <code>enum<\/code> s\u0131n\u0131flar\u0131, belirli bir sabit de\u011ferler k\u00fcmesini temsil etmek i\u00e7in kullan\u0131l\u0131r. Ancak <code>enum<\/code> s\u0131n\u0131flar\u0131, her bir de\u011ferin kendi benzersiz verilerini ta\u015f\u0131mas\u0131 gerekti\u011finde veya karma\u015f\u0131k davran\u0131\u015flar sergilemesi gerekti\u011finde yetersiz kal\u0131r. \u00d6rne\u011fin, bir a\u011f iste\u011finin durumunu <code>LOADING<\/code>, <code>SUCCESS<\/code>, <code>ERROR<\/code> olarak temsil etmek istedi\u011fimizde, <code>SUCCESS<\/code> durumu ba\u015far\u0131l\u0131 yan\u0131t verisini, <code>ERROR<\/code> durumu ise hata mesaj\u0131n\u0131 veya kodunu i\u00e7ermelidir. <code>enum<\/code> s\u0131n\u0131flar\u0131 bu t\u00fcr farkl\u0131 veri y\u00fcklerini do\u011fal olarak desteklemez. Soyut s\u0131n\u0131flar veya aray\u00fczler ise bu esnekli\u011fi sunar ancak kal\u0131t\u0131m\u0131 k\u0131s\u0131tlamazlar; yani, herhangi bir yerde yeni bir alt s\u0131n\u0131f tan\u0131mlanabilir, bu da <code>when<\/code> ifadeleri gibi durumlarda derleyiciye t\u00fcm olas\u0131 durumlar\u0131n bilindi\u011fini garanti etme imkan\u0131 vermez.<\/p>\n<p>Sealed s\u0131n\u0131flar, <code>enum<\/code>&#8216;lar\u0131n basitli\u011fini ve soyut s\u0131n\u0131flar\u0131n esnekli\u011fini bir araya getirerek bu bo\u015flu\u011fu doldurur. Bir <code>sealed<\/code> s\u0131n\u0131f, kendisi soyut olmakla birlikte, do\u011frudan alt s\u0131n\u0131flar\u0131n\u0131n sadece tan\u0131mland\u0131\u011f\u0131 dosya (Kotlin 1.5 \u00f6ncesi) veya derleme birimi (module) (Kotlin 1.5 sonras\u0131) i\u00e7inde olabilece\u011fini garanti eder. Bu k\u0131s\u0131tlama sayesinde Kotlin derleyicisi, <code>when<\/code> ifadelerini kullan\u0131rken t\u00fcm olas\u0131 alt s\u0131n\u0131flar\u0131n ele al\u0131nd\u0131\u011f\u0131ndan emin olabilir ve bir <code>else<\/code> dal\u0131 yazma zorunlulu\u011funu ortadan kald\u0131r\u0131r. Bu da, \u00f6zellikle b\u00fcy\u00fck kod tabanlar\u0131nda veya uzun s\u00fcreli projelerde geli\u015ftirici hatalar\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r ve kod refactoring&#8217;ini kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Bu makalede, Kotlin sealed s\u0131n\u0131flar\u0131n ne oldu\u011funu, nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131, temel s\u00f6zdizimini, ba\u015fl\u0131ca kullan\u0131m senaryolar\u0131n\u0131, sundu\u011fu avantajlar\u0131, s\u0131n\u0131rlamalar\u0131n\u0131 ve di\u011fer benzer yap\u0131larla (enum&#8217;lar, soyut s\u0131n\u0131flar) kar\u015f\u0131la\u015ft\u0131rmas\u0131n\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Ayr\u0131ca, Kotlin 1.5 ile gelen \u00f6nemli de\u011fi\u015fikliklere de de\u011finece\u011fiz.<\/p>\n<h2>Temel Kavramlar ve S\u00f6zdizimi<\/h2>\n<p>Sealed s\u0131n\u0131flar, Kotlin&#8217;in t\u00fcr sistemine getirdi\u011fi g\u00fc\u00e7l\u00fc bir ektir. Temel amac\u0131, bir s\u0131n\u0131f hiyerar\u015fisinin kapal\u0131 bir set olmas\u0131n\u0131 sa\u011flamakt\u0131r; yani, bu s\u0131n\u0131f\u0131n t\u00fcm do\u011frudan alt s\u0131n\u0131flar\u0131n\u0131n derleme zaman\u0131nda bilinmesini garanti etmektir.<\/p>\n<h3>Sealed S\u0131n\u0131f Nedir?<\/h3>\n<p>Bir <code>sealed<\/code> s\u0131n\u0131f, asl\u0131nda alt s\u0131n\u0131flar\u0131 s\u0131n\u0131rl\u0131 olan soyut bir s\u0131n\u0131ft\u0131r. <code>sealed<\/code> anahtar kelimesiyle i\u015faretlendi\u011finde, bu s\u0131n\u0131f\u0131n do\u011frudan alt s\u0131n\u0131flar\u0131 yaln\u0131zca belirli bir kapsam i\u00e7inde tan\u0131mlanabilir. Bu kapsam, Kotlin 1.5 \u00f6ncesinde <code>sealed<\/code> s\u0131n\u0131f\u0131n tan\u0131mland\u0131\u011f\u0131 dosya ile s\u0131n\u0131rl\u0131yken, Kotlin 1.5 ve sonras\u0131nda ayn\u0131 derleme birimi (module) i\u00e7inde herhangi bir yerde olabilir. Bu k\u0131s\u0131tlama, derleyicinin <code>sealed<\/code> s\u0131n\u0131f\u0131n t\u00fcm olas\u0131 alt tiplerini bilmesini sa\u011flar, bu da \u00f6zellikle <code>when<\/code> ifadelerinde \u00e7ok de\u011ferli bir \u00f6zelliktir.<\/p>\n<p><code>sealed<\/code> s\u0131n\u0131flar \u00f6rt\u00fck olarak soyuttur, yani do\u011frudan \u00f6rneklenemezler. Ayr\u0131ca, constructor&#8217;lar\u0131 varsay\u0131lan olarak <code>private<\/code>&#8216;d\u0131r ve <code>protected<\/code> olarak da belirtilebilir.<\/p>\n<h3>S\u00f6zdizimi<\/h3>\n<p>Bir <code>sealed<\/code> s\u0131n\u0131f tan\u0131mlamak olduk\u00e7a basittir. <code>class<\/code> anahtar kelimesinin \u00f6n\u00fcne <code>sealed<\/code> anahtar kelimesi eklenir. Alt s\u0131n\u0131flar\u0131 ise <code>sealed<\/code> s\u0131n\u0131f\u0131 miras alarak tan\u0131mlan\u0131r.<\/p>\n<pre><code class=\"language-kotlin\">sealed class Sonuc {\n    data class Basarili(val veri: String) : Sonuc()\n    data class Hata(val mesaj: String, val kod: Int) : Sonuc()\n    object Yukleniyor : Sonuc() \/\/ Tekil nesne\n    object Bos : Sonuc() \/\/ Tekil nesne\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte:<br \/>\n*   <code>Sonuc<\/code>, bir <code>sealed<\/code> s\u0131n\u0131ft\u0131r.<br \/>\n*   <code>Basarili<\/code>, <code>Hata<\/code>, <code>Yukleniyor<\/code> ve <code>Bos<\/code> ise <code>Sonuc<\/code> s\u0131n\u0131f\u0131n\u0131n do\u011frudan alt s\u0131n\u0131flar\u0131d\u0131r.<br \/>\n*   <code>Basarili<\/code> ve <code>Hata<\/code> birer <code>data class<\/code>&#8216;t\u0131r ve kendi benzersiz verilerini (veri, mesaj, kod) ta\u015f\u0131rlar.<br \/>\n*   <code>Yukleniyor<\/code> ve <code>Bos<\/code> ise <code>object<\/code>&#8216;tir, yani tekil nesnelerdir ve durumlar\u0131n\u0131 temsil etmek i\u00e7in ek bir veriye ihtiya\u00e7 duymazlar.<br \/>\n*   T\u00fcm bu alt s\u0131n\u0131flar, <code>Sonuc<\/code> s\u0131n\u0131f\u0131n\u0131 miras al\u0131r (<code>: Sonuc()<\/code>).<\/p>\n<p>Bu yap\u0131, bir i\u015flemin farkl\u0131 olas\u0131 durumlar\u0131n\u0131 (ba\u015far\u0131l\u0131, hatal\u0131, y\u00fckleniyor, bo\u015f) net ve tip g\u00fcvenli bir \u015fekilde temsil etmemizi sa\u011flar.<\/p>\n<h3>Neden <code>sealed<\/code>?<\/h3>\n<p><code>sealed<\/code> s\u0131n\u0131flar\u0131n temel faydas\u0131, kal\u0131t\u0131m\u0131 kontrol etme ve derleme zaman\u0131 g\u00fcvenli\u011fi sa\u011flamas\u0131d\u0131r. Bu sayede:<\/p>\n<p>1.  <strong>Kal\u0131t\u0131m\u0131n K\u0131s\u0131tlanmas\u0131:<\/strong> S\u0131n\u0131f hiyerar\u015fisinin sadece belirli, \u00f6nceden tan\u0131mlanm\u0131\u015f alt s\u0131n\u0131flardan olu\u015fmas\u0131n\u0131 sa\u011flar\u0131z. Bu, beklenmeyen veya istenmeyen alt s\u0131n\u0131f tan\u0131mlamalar\u0131n\u0131 engeller.<br \/>\n2.  <strong>Kapsaml\u0131 <code>when<\/code> \u0130fadeleri:<\/strong> En \u00f6nemli avantajlar\u0131ndan biridir. <code>sealed<\/code> s\u0131n\u0131f\u0131n t\u00fcm alt s\u0131n\u0131flar\u0131n\u0131 <code>when<\/code> ifadesinde ele ald\u0131\u011f\u0131m\u0131zda, Kotlin derleyicisi bir <code>else<\/code> dal\u0131 yazmam\u0131z\u0131 istemez. E\u011fer olas\u0131 bir alt s\u0131n\u0131f\u0131 unutursak, derleyici bize hata verir. Bu, kodun eksiksizli\u011fini ve hata yakalama yetene\u011fini art\u0131r\u0131r.<br \/>\n3.  <strong>Tip G\u00fcvenli\u011fi:<\/strong> Her bir durumun kendi tipine ve verisine sahip olabilmesi, g\u00fc\u00e7l\u00fc tip g\u00fcvenli\u011fi sa\u011flar. Yanl\u0131\u015f veri t\u00fcr\u00fcyle i\u015flem yapma riskini azalt\u0131r.<\/p>\n<p>Bu \u00f6zellikler, \u00f6zellikle karma\u015f\u0131k durum makineleri, olay tabanl\u0131 sistemler ve kullan\u0131c\u0131 aray\u00fcz\u00fc durum y\u00f6netimi gibi senaryolarda <code>sealed<\/code> s\u0131n\u0131flar\u0131 vazge\u00e7ilmez k\u0131lar.<\/p>\n<h2>Kullan\u0131m Senaryolar\u0131<\/h2>\n<p>Sealed s\u0131n\u0131flar, bir\u00e7ok farkl\u0131 senaryoda kodun temizli\u011fini, g\u00fcvenli\u011fini ve okunabilirli\u011fini art\u0131rmak i\u00e7in kullan\u0131labilir. \u0130\u015fte en yayg\u0131n kullan\u0131m senaryolar\u0131ndan baz\u0131lar\u0131:<\/p>\n<h3>Durum Temsili (State Representation)<\/h3>\n<p>Uygulamalarda, \u00f6zellikle kullan\u0131c\u0131 aray\u00fcz\u00fc (UI) geli\u015ftirme veya a\u011f istekleri gibi asenkron i\u015flemler s\u0131ras\u0131nda, bir bile\u015fenin veya verinin farkl\u0131 durumlar\u0131 olabilir. Sealed s\u0131n\u0131flar bu durumlar\u0131 tip g\u00fcvenli bir \u015fekilde temsil etmek i\u00e7in m\u00fckemmeldir.<\/p>\n<pre><code class=\"language-kotlin\">sealed class UiState<out T> {\n    object Loading : UiState<Nothing>()\n    data class Success<T>(val data: T) : UiState<T>()\n    data class Error(val message: String) : UiState<Nothing>()\n    object Empty : UiState<Nothing>()\n}\n\nfun handleUiState(state: UiState<String>) {\n    when (state) {\n        UiState.Loading -> println(\"Veriler y\u00fckleniyor...\")\n        is UiState.Success -> println(\"Veri ba\u015far\u0131yla al\u0131nd\u0131: ${state.data}\")\n        is UiState.Error -> println(\"Hata olu\u015ftu: ${state.message}\")\n        UiState.Empty -> println(\"G\u00f6sterilecek veri bulunamad\u0131.\")\n    }\n}\n\n\/\/ Kullan\u0131m\nfun main() {\n    handleUiState(UiState.Loading)\n    handleUiState(UiState.Success(\"Merhaba D\u00fcnya!\"))\n    handleUiState(UiState.Error(\"A\u011f ba\u011flant\u0131s\u0131 hatas\u0131\"))\n    handleUiState(UiState.Empty)\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>UiState<\/code> s\u0131n\u0131f\u0131 bir UI bile\u015feninin d\u00f6rt olas\u0131 durumunu temsil eder: <code>Loading<\/code>, <code>Success<\/code>, <code>Error<\/code>, <code>Empty<\/code>. Her durum kendi verisini ta\u015f\u0131yabilir (\u00f6rne\u011fin, <code>Success<\/code> veri, <code>Error<\/code> hata mesaj\u0131). <code>handleUiState<\/code> fonksiyonundaki <code>when<\/code> ifadesi, derleyici taraf\u0131ndan t\u00fcm durumlar\u0131n ele al\u0131nd\u0131\u011f\u0131 garanti edildi\u011fi i\u00e7in <code>else<\/code> dal\u0131na ihtiya\u00e7 duymaz.<\/p>\n<h3>Olay Temsili (Event Handling)<\/h3>\n<p>Kullan\u0131c\u0131 etkile\u015fimleri veya sistem olaylar\u0131 gibi durumlar, genellikle farkl\u0131 parametreler gerektiren farkl\u0131 olay t\u00fcrleri olarak temsil edilir. Sealed s\u0131n\u0131flar, bu olaylar\u0131 tek bir hiyerar\u015fi alt\u0131nda toplamak i\u00e7in idealdir.<\/p>\n<pre><code class=\"language-kotlin\">sealed class UserEvent {\n    data class Click(val x: Int, val y: Int) : UserEvent()\n    data class TextChanged(val newText: String) : UserEvent()\n    object SubmitForm : UserEvent()\n    object Logout : UserEvent()\n}\n\nfun processEvent(event: UserEvent) {\n    when (event) {\n        is UserEvent.Click -> println(\"T\u0131klama olay\u0131: x=${event.x}, y=${event.y}\")\n        is UserEvent.TextChanged -> println(\"Metin de\u011fi\u015fti: ${event.newText}\")\n        UserEvent.SubmitForm -> println(\"Form g\u00f6nderildi.\")\n        UserEvent.Logout -> println(\"Kullan\u0131c\u0131 \u00e7\u0131k\u0131\u015f yapt\u0131.\")\n    }\n}\n\n\/\/ Kullan\u0131m\nfun main() {\n    processEvent(UserEvent.Click(100, 200))\n    processEvent(UserEvent.TextChanged(\"Yeni de\u011fer\"))\n    processEvent(UserEvent.SubmitForm)\n}<\/code><\/pre>\n<p>Burada <code>UserEvent<\/code> s\u0131n\u0131f\u0131, farkl\u0131 kullan\u0131c\u0131 etkile\u015fimlerini temsil eder. Her olay t\u00fcr\u00fc, kendi \u00f6zel verilerini (\u00f6rne\u011fin, <code>Click<\/code> i\u00e7in koordinatlar, <code>TextChanged<\/code> i\u00e7in yeni metin) ta\u015f\u0131yabilir. Bu yap\u0131, olay i\u015fleme mant\u0131\u011f\u0131n\u0131 merkezi ve d\u00fczenli tutar.<\/p>\n<h3>Hata Y\u00f6netimi (Error Handling)<\/h3>\n<p>Bir uygulaman\u0131n farkl\u0131 katmanlar\u0131nda ortaya \u00e7\u0131kabilecek hata t\u00fcrlerini standardize etmek ve y\u00f6netmek i\u00e7in sealed s\u0131n\u0131flar kullan\u0131labilir. Bu, hata mesajlar\u0131n\u0131 veya kodlar\u0131n\u0131 ta\u015f\u0131yan \u00f6zel hata nesneleri olu\u015fturmay\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-kotlin\">sealed class AppError {\n    data class NetworkError(val code: Int, val message: String) : AppError()\n    data class DatabaseError(val exception: Exception) : AppError()\n    object Unauthorized : AppError()\n    object UnknownError : AppError()\n}\n\nfun handleError(error: AppError) {\n    when (error) {\n        is AppError.NetworkError -> println(\"A\u011f hatas\u0131: Kod ${error.code}, Mesaj: ${error.message}\")\n        is AppError.DatabaseError -> println(\"Veritaban\u0131 hatas\u0131: ${error.exception.localizedMessage}\")\n        AppError.Unauthorized -> println(\"Yetkilendirme hatas\u0131.\")\n        AppError.UnknownError -> println(\"Bilinmeyen bir hata olu\u015ftu.\")\n    }\n}\n\n\/\/ Kullan\u0131m\nfun main() {\n    handleError(AppError.NetworkError(500, \"Sunucu hatas\u0131\"))\n    handleError(AppError.DatabaseError(IllegalStateException(\"Tablo bulunamad\u0131\")))\n}<\/code><\/pre>\n<p><code>AppError<\/code> s\u0131n\u0131f\u0131, uygulaman\u0131n kar\u015f\u0131la\u015fabilece\u011fi \u00e7e\u015fitli hata t\u00fcrlerini kapsar. Bu, hata i\u015fleme mant\u0131\u011f\u0131n\u0131 daha mod\u00fcler ve anla\u015f\u0131l\u0131r hale getirir.<\/p>\n<h3>D\u0131\u015flanm\u0131\u015f Hiyerar\u015filer (Restricted Hierarchies)<\/h3>\n<p>Matematiksel \u015fekiller, komut desenleri veya yap\u0131land\u0131rma se\u00e7enekleri gibi belirli bir k\u00fcme i\u00e7indeki farkl\u0131 ancak ili\u015fkili t\u00fcrleri temsil etmek i\u00e7in sealed s\u0131n\u0131flar kullan\u0131labilir.<\/p>\n<pre><code class=\"language-kotlin\">sealed class Shape {\n    data class Circle(val radius: Double) : Shape()\n    data class Rectangle(val width: Double, val height: Double) : Shape()\n    data class Triangle(val side1: Double, val side2: Double, val side3: Double) : Shape()\n}\n\nfun calculateArea(shape: Shape): Double {\n    return when (shape) {\n        is Shape.Circle -> Math.PI <em> shape.radius <\/em> shape.radius\n        is Shape.Rectangle -> shape.width * shape.height\n        is Shape.Triangle -> {\n            val s = (shape.side1 + shape.side2 + shape.side3) \/ 2\n            Math.sqrt(s <em> (s - shape.side1) <\/em> (s - shape.side2) * (s - shape.side3))\n        }\n    }\n}\n\n\/\/ Kullan\u0131m\nfun main() {\n    val circle = Shape.Circle(5.0)\n    val rectangle = Shape.Rectangle(4.0, 6.0)\n    val triangle = Shape.Triangle(3.0, 4.0, 5.0)\n\n    println(\"Daire alan\u0131: ${calculateArea(circle)}\")\n    println(\"Dikd\u00f6rtgen alan\u0131: ${calculateArea(rectangle)}\")\n    println(\"\u00dc\u00e7gen alan\u0131: ${calculateArea(triangle)}\")\n}<\/code><\/pre>\n<p><code>Shape<\/code> s\u0131n\u0131f\u0131, geometrik \u015fekillerin kapal\u0131 bir hiyerar\u015fisini tan\u0131mlar. <code>calculateArea<\/code> fonksiyonu, her \u015fekil t\u00fcr\u00fc i\u00e7in do\u011fru alan\u0131 hesaplamak i\u00e7in <code>when<\/code> ifadesini kullan\u0131r ve derleyici, t\u00fcm \u015fekil t\u00fcrlerinin ele al\u0131nd\u0131\u011f\u0131n\u0131 garanti eder.<\/p>\n<h2>Sealed S\u0131n\u0131flar\u0131n Avantajlar\u0131<\/h2>\n<p>Sealed s\u0131n\u0131flar, Kotlin geli\u015ftiricilerine bir dizi \u00f6nemli avantaj sunar ve modern, robust uygulamalar geli\u015ftirmeyi kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Derleme Zaman\u0131 G\u00fcvenli\u011fi (Compile-Time Safety)<\/h3>\n<p>Bu, sealed s\u0131n\u0131flar\u0131n en b\u00fcy\u00fck ve en \u00e7ok \u00f6ne \u00e7\u0131kan avantaj\u0131d\u0131r. <code>when<\/code> ifadesiyle bir sealed s\u0131n\u0131f\u0131n t\u00fcm alt s\u0131n\u0131flar\u0131n\u0131 ele ald\u0131\u011f\u0131n\u0131zda, derleyici bu durumun kapsaml\u0131 oldu\u011funu (exhaustive) kontrol eder. E\u011fer bir alt s\u0131n\u0131f\u0131 i\u015flemeyi unutursan\u0131z, derleyici size bir hata verir ve kodu derlemenize izin vermez. Bu, runtime&#8217;da beklenmedik durumlarla kar\u015f\u0131la\u015fma riskini ortadan kald\u0131r\u0131r ve hata ay\u0131klama s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<pre><code class=\"language-kotlin\">sealed class TrafficLight {\n    object Red : TrafficLight()\n    object Yellow : TrafficLight()\n    object Green : TrafficLight()\n}\n\nfun getNextLight(currentLight: TrafficLight): TrafficLight {\n    return when (currentLight) {\n        TrafficLight.Red -> TrafficLight.Green\n        TrafficLight.Yellow -> TrafficLight.Red\n        TrafficLight.Green -> TrafficLight.Yellow\n        \/\/ E\u011fer yeni bir alt s\u0131n\u0131f eklersek (\u00f6rne\u011fin, FlashingYellow),\n        \/\/ bu when ifadesi derleme hatas\u0131 verecektir.\n        \/\/ Bu sayede eksik durumlar\u0131 kolayca tespit edebiliriz.\n    }\n}<\/code><\/pre>\n<h3>Daha Okunabilir ve Bak\u0131m\u0131 Kolay Kod (More Readable and Maintainable Code)<\/h3>\n<p>Sealed s\u0131n\u0131flar, olas\u0131 durumlar\u0131 veya t\u00fcrleri a\u00e7\u0131k\u00e7a tan\u0131mlayarak kodun niyetini netle\u015ftirir. Bir s\u0131n\u0131f\u0131n hangi alt tiplere sahip olabilece\u011fini g\u00f6rmek i\u00e7in t\u00fcm kod taban\u0131n\u0131 araman\u0131za gerek kalmaz; her \u015fey <code>sealed<\/code> s\u0131n\u0131f\u0131n tan\u0131m\u0131nda veya ayn\u0131 derleme biriminde merkezi olarak bulunur. Bu, yeni bir geli\u015ftiricinin projeye adapte olmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r ve uzun vadede kodun bak\u0131m\u0131n\u0131 basitle\u015ftirir. Bir alt s\u0131n\u0131f eklendi\u011finde veya de\u011fi\u015ftirildi\u011finde, derleyici ilgili t\u00fcm <code>when<\/code> ifadelerini kontrol etmenizi sa\u011flayarak refactoring s\u00fcrecini daha g\u00fcvenli hale getirir.<\/p>\n<h3>Tek Tip Kontrol (Type Checking)<\/h3>\n<p><code>is<\/code> ve <code>as<\/code> operat\u00f6rleriyle birlikte sealed s\u0131n\u0131flar, g\u00fc\u00e7l\u00fc ve sezgisel tip kontrol\u00fc sa\u011flar. <code>when<\/code> ifadesi i\u00e7inde, bir alt s\u0131n\u0131f\u0131n tipi otomatik olarak ak\u0131ll\u0131ca at\u0131l\u0131r (smart cast), bu da ek tip d\u00f6n\u00fc\u015f\u00fcmlerine gerek kalmadan do\u011frudan alt s\u0131n\u0131f\u0131n \u00f6zelliklerine eri\u015fmenizi sa\u011flar.<\/p>\n<pre><code class=\"language-kotlin\">fun processData(data: Sonuc) {\n    when (data) {\n        is Sonuc.Basarili -> println(\"Veri: ${data.veri.length}\") \/\/ data otomatik olarak Sonuc.Basarili tipine d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr\n        is Sonuc.Hata -> println(\"Hata mesaj\u0131: ${data.mesaj.toUpperCase()}\")\n        \/\/ ... di\u011fer durumlar\n    }\n}<\/code><\/pre>\n<h3>Performans (Performance)<\/h3>\n<p>Sealed s\u0131n\u0131flar\u0131n kullan\u0131m\u0131, genel olarak uygulaman\u0131n performans\u0131 \u00fczerinde ihmal edilebilir bir etkiye sahiptir. Derleyici, sealed s\u0131n\u0131flar\u0131 ve alt s\u0131n\u0131flar\u0131n\u0131 optimize edilmi\u015f bir \u015fekilde ele al\u0131r. <code>when<\/code> ifadeleri, runtime&#8217;da karma\u015f\u0131k yans\u0131ma (reflection) mekanizmalar\u0131 yerine, do\u011frudan tip kar\u015f\u0131la\u015ft\u0131rmalar\u0131 ve dallanmalar kullan\u0131larak verimli bir \u015fekilde \u00e7al\u0131\u015f\u0131r. Bu, <code>enum<\/code> s\u0131n\u0131flar\u0131na benzer bir performans profili sunar, ancak \u00e7ok daha fazla esneklik sa\u011flar.<\/p>\n<h2>Sealed S\u0131n\u0131flar\u0131n S\u0131n\u0131rlamalar\u0131 ve Dikkat Edilmesi Gerekenler<\/h2>\n<p>Sealed s\u0131n\u0131flar g\u00fc\u00e7l\u00fc bir ara\u00e7 olsa da, baz\u0131 k\u0131s\u0131tlamalar\u0131 ve dikkat edilmesi gereken noktalar\u0131 vard\u0131r. Bu k\u0131s\u0131tlamalar, sealed s\u0131n\u0131flar\u0131n temel tasar\u0131m felsefesinden kaynaklan\u0131r ve asl\u0131nda onlar\u0131n g\u00fcc\u00fcn\u00fc de olu\u015fturur.<\/p>\n<h3>Ayn\u0131 Dosya\/Paket K\u0131s\u0131tlamas\u0131 (Kotlin 1.5 \u00d6ncesi) \/ Ayn\u0131 Mod\u00fcl K\u0131s\u0131tlamas\u0131 (Kotlin 1.5 ve Sonras\u0131)<\/h3>\n<p>Bu, sealed s\u0131n\u0131flar\u0131n en belirgin k\u0131s\u0131tlamas\u0131yd\u0131 ve Kotlin 1.5 ile \u00f6nemli \u00f6l\u00e7\u00fcde gev\u015fetildi.<\/p>\n<p>*   <strong>Kotlin 1.5 \u00d6ncesi:<\/strong> Bir <code>sealed<\/code> s\u0131n\u0131f\u0131n t\u00fcm do\u011frudan alt s\u0131n\u0131flar\u0131, <code>sealed<\/code> s\u0131n\u0131f\u0131n tan\u0131mland\u0131\u011f\u0131 <strong>ayn\u0131 <code>.kt<\/code> dosyas\u0131<\/strong> i\u00e7inde bulunmak zorundayd\u0131. Bu, b\u00fcy\u00fck sealed hiyerar\u015fileri i\u00e7in dosyalar\u0131n \u00e7ok uzun ve karma\u015f\u0131k hale gelmesine neden olabiliyordu.<br \/>\n*   <strong>Kotlin 1.5 ve Sonras\u0131:<\/strong> Art\u0131k do\u011frudan alt s\u0131n\u0131flar, <code>sealed<\/code> s\u0131n\u0131f\u0131n tan\u0131mland\u0131\u011f\u0131 <strong>ayn\u0131 derleme birimi (module)<\/strong> i\u00e7inde herhangi bir dosyada ve herhangi bir pakette tan\u0131mlanabilir. Bu, sealed s\u0131n\u0131flar\u0131n daha mod\u00fcler ve d\u00fczenli bir \u015fekilde kullan\u0131lmas\u0131n\u0131 sa\u011flar. Bu gev\u015feme, sealed s\u0131n\u0131flar\u0131n kullan\u0131m esnekli\u011fini art\u0131r\u0131rken, derleyicinin t\u00fcm alt s\u0131n\u0131flar\u0131 derleme zaman\u0131nda bilebilme temel ilkesini korur.<\/p>\n<p>Bu k\u0131s\u0131tlaman\u0131n temel nedeni, derleyicinin <code>when<\/code> ifadelerinin kapsaml\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol edebilmesi i\u00e7in t\u00fcm olas\u0131 alt s\u0131n\u0131flar\u0131 derleme zaman\u0131nda bilmesi gerekti\u011fidir. E\u011fer alt s\u0131n\u0131flar rastgele farkl\u0131 mod\u00fcllerde tan\u0131mlanabilseydi, derleyici bu kontrol\u00fc yapamazd\u0131.<\/p>\n<h3>Soyut Olma (Implicitly Abstract)<\/h3>\n<p><code>sealed<\/code> s\u0131n\u0131flar \u00f6rt\u00fck olarak soyuttur, yani do\u011frudan \u00f6rneklenemezler. Bir <code>sealed<\/code> s\u0131n\u0131f\u0131n constructor&#8217;\u0131 varsay\u0131lan olarak <code>private<\/code>&#8216;d\u0131r ve <code>protected<\/code> olarak da belirtilebilir. Bu, <code>sealed<\/code> s\u0131n\u0131f\u0131n yaln\u0131zca alt s\u0131n\u0131flar\u0131 arac\u0131l\u0131\u011f\u0131yla temsil edilmesini sa\u011flar ve mant\u0131ksal olarak bir durum veya hiyerar\u015fi k\u00f6k\u00fc olarak i\u015flev g\u00f6rmesini sa\u011flar.<\/p>\n<pre><code class=\"language-kotlin\">sealed class MySealedClass\n\/\/ val instance = MySealedClass() \/\/ Hata: 'MySealedClass' soyut ve do\u011frudan \u00f6rneklenemez.<\/code><\/pre>\n<h3><code>final<\/code> Olamaz (Cannot be <code>final<\/code>)<\/h3>\n<p>Bir <code>sealed<\/code> s\u0131n\u0131f\u0131n <code>final<\/code> olmas\u0131 mant\u0131ks\u0131zd\u0131r, \u00e7\u00fcnk\u00fc <code>sealed<\/code> anahtar kelimesi zaten alt s\u0131n\u0131flara sahip olaca\u011f\u0131n\u0131 ima eder. Bu nedenle, bir <code>sealed<\/code> s\u0131n\u0131f\u0131 <code>final<\/code> olarak i\u015faretleyemezsiniz.<\/p>\n<h3>Veri S\u0131n\u0131flar\u0131 ile Kar\u015f\u0131la\u015ft\u0131rma (Comparison with Data Classes)<\/h3>\n<p>Sealed s\u0131n\u0131flar ve veri s\u0131n\u0131flar\u0131 (data classes) bazen kar\u0131\u015ft\u0131r\u0131labilir \u00e7\u00fcnk\u00fc her ikisi de veri ta\u015f\u0131yan nesneler olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. Ancak temel farklar\u0131 vard\u0131r:<\/p>\n<p>*   <strong><code>data class<\/code>:<\/strong> Veri depolamak ve ta\u015f\u0131mak i\u00e7in tasarlanm\u0131\u015f basit s\u0131n\u0131flard\u0131r. <code>equals()<\/code>, <code>hashCode()<\/code>, <code>toString()<\/code>, <code>copy()<\/code> gibi standart fonksiyonlar\u0131 otomatik olarak sa\u011flarlar. Bir <code>data class<\/code> bir hiyerar\u015fi tan\u0131mlamaz, sadece tek bir veri yap\u0131s\u0131n\u0131 temsil eder.<br \/>\n*   <strong><code>sealed class<\/code>:<\/strong> Bir s\u0131n\u0131f hiyerar\u015fisi tan\u0131mlamak ve bu hiyerar\u015finin kapal\u0131 bir set olmas\u0131n\u0131 sa\u011flamak i\u00e7in kullan\u0131l\u0131r. Alt s\u0131n\u0131flar\u0131 <code>data class<\/code>, <code>object<\/code> veya normal <code>class<\/code> olabilir.<\/p>\n<p>\u00d6zetle, <code>data class<\/code> tek bir &#8220;\u015fey&#8221;i temsil ederken, <code>sealed class<\/code> bir &#8220;durumlar k\u00fcmesi&#8221; veya &#8220;t\u00fcrler hiyerar\u015fisi&#8221;ni temsil eder. Genellikle <code>sealed<\/code> s\u0131n\u0131flar\u0131n alt s\u0131n\u0131flar\u0131 olarak <code>data class<\/code>&#8216;lar kullan\u0131l\u0131r, bu da her bir durumun kendi verilerini ta\u015f\u0131mas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Sealed S\u0131n\u0131flar vs. Enum S\u0131n\u0131flar<\/h2>\n<p>Kotlin&#8217;de hem <code>sealed<\/code> s\u0131n\u0131flar hem de <code>enum<\/code> s\u0131n\u0131flar, s\u0131n\u0131rl\u0131 bir de\u011ferler veya durumlar k\u00fcmesini temsil etmek i\u00e7in kullan\u0131l\u0131r. Ancak, aralar\u0131nda \u00f6nemli yap\u0131sal ve kullan\u0131m farkl\u0131l\u0131klar\u0131 vard\u0131r. Do\u011fru arac\u0131 do\u011fru senaryoda se\u00e7mek, kodunuzun verimlili\u011fini ve okunabilirli\u011fini art\u0131r\u0131r.<\/p>\n<h3>Temel Farklar<\/h3>\n<p>1.  <strong>\u00d6rnekleme ve Veri Y\u00fck\u00fc:<\/strong><br \/>\n    *   <strong>Enum:<\/strong> Her bir enum sabiti, tekil (singleton) bir nesnedir. Yani <code>Renk.KIRMIZI<\/code> her zaman ayn\u0131 nesneyi ifade eder. Enum sabitleri, kendi \u00f6zelliklerine sahip olabilir ancak bu \u00f6zellikler, t\u00fcm enum sabitleri i\u00e7in ayn\u0131 yap\u0131ya sahiptir. Farkl\u0131 enum sabitleri farkl\u0131 tiplerde veri ta\u015f\u0131yamaz; hepsi ayn\u0131 enum tipindedir.<br \/>\n    *   <strong>Sealed Class:<\/strong> Alt s\u0131n\u0131flar\u0131 farkl\u0131 tiplerde olabilir (data class, object, normal class). Her alt s\u0131n\u0131f\u0131n kendi benzersiz verileri ve davran\u0131\u015flar\u0131 olabilir ve birden fazla \u00f6rne\u011fi olu\u015fturulabilir (e\u011fer <code>object<\/code> de\u011filse). \u00d6rne\u011fin, <code>Sonuc.Basarili(\"veri\")<\/code> ve <code>Sonuc.Basarili(\"ba\u015fka veri\")<\/code> iki farkl\u0131 <code>Basarili<\/code> nesnesidir.<\/p>\n<p>2.  <strong>Kal\u0131t\u0131m:<\/strong><br \/>\n    *   <strong>Enum:<\/strong> Enum s\u0131n\u0131flar\u0131 \u00f6rt\u00fck olarak <code>Enum<\/code> s\u0131n\u0131f\u0131n\u0131 miras al\u0131r ve ba\u015fka bir s\u0131n\u0131f\u0131 miras alamazlar.<br \/>\n    *   <strong>Sealed Class:<\/strong> Sealed s\u0131n\u0131flar soyut s\u0131n\u0131flard\u0131r ve kendi alt s\u0131n\u0131flar\u0131 olabilir. Alt s\u0131n\u0131flar da kendi i\u00e7lerinde ba\u015fka s\u0131n\u0131flar\u0131 miras alabilir veya aray\u00fczleri implement edebilir.<\/p>\n<p>3.  <strong>Kapsam:<\/strong><br \/>\n    *   <strong>Enum:<\/strong> Enum sabitleri, <code>enum<\/code> s\u0131n\u0131f\u0131n\u0131n i\u00e7inde tan\u0131mlan\u0131r.<br \/>\n    *   <strong>Sealed Class:<\/strong> Alt s\u0131n\u0131flar, <code>sealed<\/code> s\u0131n\u0131f\u0131n tan\u0131mland\u0131\u011f\u0131 ayn\u0131 mod\u00fcl i\u00e7inde herhangi bir yerde olabilir (Kotlin 1.5+).<\/p>\n<h3>Ne Zaman Hangisi?<\/h3>\n<p>*   <strong>Enum S\u0131n\u0131flar\u0131 Kullan\u0131n:<\/strong><br \/>\n    *   Birbirinden ayr\u0131, sabit ve tekil de\u011ferler k\u00fcmesini temsil etmek istedi\u011finizde.<br \/>\n    *   Her bir de\u011ferin kendi \u00f6zel verisine veya davran\u0131\u015f\u0131na ihtiya\u00e7 duymad\u0131\u011f\u0131 durumlarda (veya t\u00fcm de\u011ferler ayn\u0131 yap\u0131ya sahipse).<br \/>\n    *   \u00d6rnekler: Haftan\u0131n g\u00fcnleri (<code>Pazartesi<\/code>, <code>Sal\u0131<\/code>), renkler (<code>K\u0131rm\u0131z\u0131<\/code>, <code>Mavi<\/code>), basit durumlar (<code>A\u00e7\u0131k<\/code>, <code>Kapal\u0131<\/code>), y\u00f6nler (<code>Kuzey<\/code>, <code>G\u00fcney<\/code>).<\/p>\n<p>*   <strong>Sealed S\u0131n\u0131flar\u0131 Kullan\u0131n:<\/strong><br \/>\n    *   Birbirinden farkl\u0131 veriler ta\u015f\u0131yan veya farkl\u0131 davran\u0131\u015flar sergileyen durumlar veya t\u00fcrler hiyerar\u015fisi olu\u015fturmak istedi\u011finizde.<br \/>\n    *   <code>when<\/code> ifadelerinde derleme zaman\u0131 kapsaml\u0131l\u0131k kontrol\u00fcnden (exhaustive check) faydalanmak istedi\u011finizde.<br \/>\n    *   \u00d6rnekler: A\u011f isteklerinin durumu (<code>Y\u00fckleniyor<\/code>, <code>Ba\u015far\u0131l\u0131(veri)<\/code>, <code>Hata(mesaj)<\/code>), UI durumlar\u0131, farkl\u0131 hata t\u00fcrleri, farkl\u0131 \u015fekiller (daire, kare, \u00fc\u00e7gen).<\/p>\n<h3>\u00d6rnek Kar\u015f\u0131la\u015ft\u0131rma<\/h3>\n<p>Basit bir i\u015flem sonucunu temsil etmek i\u00e7in hem <code>enum<\/code> hem de <code>sealed<\/code> s\u0131n\u0131f\u0131 nas\u0131l kullanabilece\u011fimize bakal\u0131m:<\/p>\n<p><strong>Enum ile:<\/strong><\/p>\n<pre><code class=\"language-kotlin\">enum class Status {\n    LOADING,\n    SUCCESS,\n    ERROR\n}\n\n\/\/ Bu durumda SUCCESS veya ERROR durumlar\u0131na \u00f6zel veri ekleyemeyiz.\n\/\/ E\u011fer bir hata mesaj\u0131 veya ba\u015far\u0131 verisi eklemek istersek,\n\/\/ bu enum'un i\u00e7inde tutulamaz veya \u00e7ok \u00e7irkin \u00e7\u00f6z\u00fcmler gerektirir.<\/code><\/pre>\n<p><strong>Sealed Class ile:<\/strong><\/p>\n<pre><code class=\"language-kotlin\">sealed class Result<out T> {\n    object Loading : Result<Nothing>()\n    data class Success<T>(val data: T) : Result<T>()\n    data class Error(val message: String) : Result<Nothing>()\n}\n\nfun handleResult(result: Result<String>) {\n    when (result) {\n        Result.Loading -> println(\"Y\u00fckleniyor...\")\n        is Result.Success -> println(\"Veri: ${result.data}\")\n        is Result.Error -> println(\"Hata: ${result.message}\")\n    }\n}<\/code><\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, <code>sealed<\/code> s\u0131n\u0131f, her bir duruma \u00f6zg\u00fc verileri ta\u015f\u0131ma esnekli\u011fi sunarken, <code>enum<\/code> sadece sabit, veri i\u00e7ermeyen durumlar i\u00e7in daha uygundur. Bu nedenle, \u00e7o\u011fu modern Android veya backend uygulamas\u0131nda, \u00f6zellikle asenkron i\u015flemlerin sonu\u00e7lar\u0131n\u0131 veya UI durumlar\u0131n\u0131 temsil etmek i\u00e7in <code>sealed<\/code> s\u0131n\u0131flar tercih edilir.<\/p>\n<h2>Sealed S\u0131n\u0131flar vs. Soyut S\u0131n\u0131flar\/Aray\u00fczler<\/h2>\n<p>Sealed s\u0131n\u0131flar, soyut s\u0131n\u0131flar ve aray\u00fczler, Kotlin&#8217;de kal\u0131t\u0131m ve polimorfizm i\u00e7in kullan\u0131lan temel yap\u0131lard\u0131r. Her birinin kendine \u00f6zg\u00fc kullan\u0131m alanlar\u0131 ve \u00f6zellikleri vard\u0131r. Sealed s\u0131n\u0131flar, soyut s\u0131n\u0131flar ve aray\u00fczler aras\u0131nda bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr, belirli k\u0131s\u0131tlamalarla esneklik sunar.<\/p>\n<h3>Temel Farklar<\/h3>\n<p>1.  <strong>Kal\u0131t\u0131m K\u0131s\u0131tlamas\u0131:<\/strong><br \/>\n    *   <strong>Soyut S\u0131n\u0131f\/Aray\u00fcz:<\/strong> Kal\u0131t\u0131m\u0131 veya implementasyonu k\u0131s\u0131tlamaz. Herhangi bir mod\u00fclde veya dosyada, bu soyut s\u0131n\u0131f\u0131 miras alan veya aray\u00fcz\u00fc implement eden yeni s\u0131n\u0131flar tan\u0131mlanabilir. Derleyici, bu yap\u0131lar\u0131n t\u00fcm olas\u0131 alt tiplerini derleme zaman\u0131nda bilemez.<br \/>\n    *   <strong>Sealed Class:<\/strong> Kal\u0131t\u0131m\u0131 k\u0131s\u0131tlar. Do\u011frudan alt s\u0131n\u0131flar\u0131, <code>sealed<\/code> s\u0131n\u0131f\u0131n tan\u0131mland\u0131\u011f\u0131 ayn\u0131 derleme birimi (module) i\u00e7inde olmak zorundad\u0131r. Bu, derleyicinin t\u00fcm olas\u0131 alt tipleri bilmesini sa\u011flar.<\/p>\n<p>2.  <strong>\u00d6rnekleme:<\/strong><br \/>\n    *   <strong>Soyut S\u0131n\u0131f\/Aray\u00fcz:<\/strong> Do\u011frudan \u00f6rneklenemezler.<br \/>\n    *   <strong>Sealed Class:<\/strong> Do\u011frudan \u00f6rneklenemezler (\u00f6rt\u00fck olarak soyutturlar).<\/p>\n<p>3.  <strong><code>when<\/code> \u0130fadeleri ile Kapsaml\u0131l\u0131k (Exhaustiveness):<\/strong><br \/>\n    *   <strong>Soyut S\u0131n\u0131f\/Aray\u00fcz:<\/strong> Bir soyut s\u0131n\u0131f veya aray\u00fcz\u00fcn alt tipleriyle <code>when<\/code> ifadesi kullan\u0131ld\u0131\u011f\u0131nda, derleyici t\u00fcm olas\u0131 alt tiplerin ele al\u0131nd\u0131\u011f\u0131n\u0131 garanti edemez. Bu nedenle, genellikle bir <code>else<\/code> dal\u0131 veya <code>is<\/code> kontrol\u00fc eklemek gerekir. Yeni bir alt s\u0131n\u0131f eklendi\u011finde, <code>when<\/code> ifadesinin g\u00fcncellenmesi gerekti\u011fi konusunda derleyici bir uyar\u0131 veya hata vermez.<br \/>\n    *   <strong>Sealed Class:<\/strong> Sealed s\u0131n\u0131flar\u0131n en b\u00fcy\u00fck avantaj\u0131 buradad\u0131r. <code>when<\/code> ifadesiyle bir sealed s\u0131n\u0131f\u0131n t\u00fcm alt s\u0131n\u0131flar\u0131n\u0131 ele ald\u0131\u011f\u0131n\u0131zda, derleyici bunun kapsaml\u0131 oldu\u011funu kontrol eder ve bir <code>else<\/code> dal\u0131 gerektirmez. Yeni bir alt s\u0131n\u0131f eklendi\u011finde ve <code>when<\/code> ifadesi g\u00fcncellenmedi\u011finde, derleyici bir hata verir, bu da refactoring ve bak\u0131m s\u0131ras\u0131nda b\u00fcy\u00fck bir g\u00fcvenlik sa\u011flar.<\/p>\n<h3>Ne Zaman Hangisi?<\/h3>\n<p>*   <strong>Aray\u00fcz (Interface) Kullan\u0131n:<\/strong><br \/>\n    *   Farkl\u0131 s\u0131n\u0131flar aras\u0131nda ortak bir davran\u0131\u015f s\u00f6zle\u015fmesi tan\u0131mlamak istedi\u011finizde.<br \/>\n    *   Soyut metotlar ve\/veya varsay\u0131lan implementasyonlar i\u00e7erebilir.<br \/>\n    *   \u00c7oklu kal\u0131t\u0131m (bir s\u0131n\u0131f birden fazla aray\u00fcz\u00fc implement edebilir) i\u00e7in idealdir.<br \/>\n    *   \u00d6rnek: <code>Clickable<\/code>, <code>Serializable<\/code>, <code>Runnable<\/code>.<\/p>\n<p>*   <strong>Soyut S\u0131n\u0131f (Abstract Class) Kullan\u0131n:<\/strong><br \/>\n    *   Bir temel s\u0131n\u0131f hiyerar\u015fisi tan\u0131mlamak ve alt s\u0131n\u0131flar aras\u0131nda ortak implementasyon veya durum payla\u015f\u0131m\u0131 sa\u011flamak istedi\u011finizde.<br \/>\n    *   Baz\u0131 metotlar\u0131n varsay\u0131lan implementasyonlar\u0131n\u0131 sa\u011flay\u0131p, baz\u0131lar\u0131n\u0131 alt s\u0131n\u0131flar\u0131n implement etmesini zorunlu k\u0131labilirsiniz.<br \/>\n    *   Tekli kal\u0131t\u0131m (bir s\u0131n\u0131f sadece bir soyut s\u0131n\u0131f\u0131 miras alabilir) i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   \u00d6rnek: <code>BaseViewModel<\/code>, <code>Animal<\/code> (alt s\u0131n\u0131flar <code>Dog<\/code>, <code>Cat<\/code> gibi).<\/p>\n<p>*   <strong>Sealed S\u0131n\u0131f (Sealed Class) Kullan\u0131n:<\/strong><br \/>\n    *   Bir durum k\u00fcmesini, olay k\u00fcmesini veya kapal\u0131 bir t\u00fcr hiyerar\u015fisini temsil etmek istedi\u011finizde.<br \/>\n    *   T\u00fcm olas\u0131 alt tiplerin derleme zaman\u0131nda bilinmesini ve <code>when<\/code> ifadelerinde kapsaml\u0131l\u0131k kontrol\u00fc yap\u0131lmas\u0131n\u0131 istedi\u011finizde.<br \/>\n    *   S\u0131n\u0131f hiyerar\u015fisinin gelecekteki geni\u015flemesini belirli bir mod\u00fcl i\u00e7inde tutmak ve kontrol alt\u0131nda tutmak istedi\u011finizde.<br \/>\n    *   \u00d6rnek: <code>Result<\/code>, <code>UiState<\/code>, <code>Shape<\/code>.<\/p>\n<h3>Exhaustive <code>when<\/code> Avantaj\u0131<\/h3>\n<p>Sealed s\u0131n\u0131flar\u0131n en belirgin avantaj\u0131, yukar\u0131da bahsedildi\u011fi gibi <code>when<\/code> ifadelerinin kapsaml\u0131l\u0131\u011f\u0131d\u0131r. Bu \u00f6zellik, soyut s\u0131n\u0131flar veya aray\u00fczler i\u00e7in mevcut de\u011fildir.<\/p>\n<pre><code class=\"language-kotlin\">\/\/ Abstract class \u00f6rne\u011fi\nabstract class Animal {\n    abstract fun makeSound()\n}\nclass Dog : Animal() { override fun makeSound() = println(\"Hav hav\") }\nclass Cat : Animal() { override fun makeSound() = println(\"Miyav\") }\n\nfun describeAnimal(animal: Animal) {\n    when (animal) {\n        is Dog -> println(\"Bu bir k\u00f6pek.\")\n        is Cat -> println(\"Bu bir kedi.\")\n        \/\/ Yeni bir alt s\u0131n\u0131f (\u00f6rne\u011fin, Bird) ekledi\u011fimizde,\n        \/\/ derleyici burada bir hata vermez.\n        \/\/ Bu y\u00fczden genellikle bir 'else' dal\u0131 eklemek gerekir:\n        \/\/ else -> println(\"Bilinmeyen hayvan t\u00fcr\u00fc.\")\n    }\n}<\/code><\/pre>\n<p>Yukar\u0131daki <code>describeAnimal<\/code> fonksiyonuna <code>Bird<\/code> ad\u0131nda yeni bir <code>Animal<\/code> alt s\u0131n\u0131f\u0131 ekledi\u011fimizde, derleyici bize <code>when<\/code> ifadesini g\u00fcncellememiz gerekti\u011fini s\u00f6ylemez. Bu, runtime&#8217;da beklenmeyen davran\u0131\u015flara yol a\u00e7abilir. Sealed s\u0131n\u0131flar bu riski ortadan kald\u0131r\u0131r.<\/p>\n<h2>Geli\u015fmi\u015f Kullan\u0131m ve \u0130pu\u00e7lar\u0131<\/h2>\n<p>Sealed s\u0131n\u0131flar\u0131n temel kullan\u0131m\u0131n\u0131n \u00f6tesinde, daha karma\u015f\u0131k senaryolarda ve modern Kotlin \u00f6zellikleriyle birlikte nas\u0131l kullan\u0131labilece\u011fine dair baz\u0131 geli\u015fmi\u015f ipu\u00e7lar\u0131 bulunmaktad\u0131r.<\/p>\n<h3>\u0130\u00e7 \u0130\u00e7e Sealed S\u0131n\u0131flar (Nested Sealed Classes)<\/h3>\n<p>Daha karma\u015f\u0131k durum hiyerar\u015fileri veya daha fazla detay gerektiren durumlar i\u00e7in i\u00e7 i\u00e7e sealed s\u0131n\u0131flar kullanmak m\u00fcmk\u00fcnd\u00fcr. Bu, bir ana durumu daha spesifik alt durumlara ay\u0131rman\u0131za olanak tan\u0131r.<\/p>\n<pre><code class=\"language-kotlin\">sealed class AuthenticationState {\n    object Idle : AuthenticationState()\n    object Loading : AuthenticationState()\n    sealed class Authenticated : AuthenticationState() {\n        data class Success(val userToken: String) : Authenticated()\n        data class TwoFactorRequired(val userId: String) : Authenticated()\n    }\n    sealed class Error : AuthenticationState() {\n        data class NetworkError(val message: String) : Error()\n        data class InvalidCredentials(val attemptsLeft: Int) : Error()\n        object UserNotFound : Error()\n    }\n}\n\nfun handleAuthState(state: AuthenticationState) {\n    when (state) {\n        AuthenticationState.Idle -> println(\"Kimlik do\u011frulama bekleniyor.\")\n        AuthenticationState.Loading -> println(\"Kimlik do\u011frulan\u0131yor...\")\n        is AuthenticationState.Authenticated.Success -> println(\"Giri\u015f ba\u015far\u0131l\u0131: ${state.userToken}\")\n        is AuthenticationState.Authenticated.TwoFactorRequired -> println(\"\u0130ki fakt\u00f6rl\u00fc kimlik do\u011frulama gerekli: ${state.userId}\")\n        is AuthenticationState.Error.NetworkError -> println(\"A\u011f hatas\u0131: ${state.message}\")\n        is AuthenticationState.Error.InvalidCredentials -> println(\"Yanl\u0131\u015f kimlik bilgileri. Kalan deneme: ${state.attemptsLeft}\")\n        AuthenticationState.Error.UserNotFound -> println(\"Kullan\u0131c\u0131 bulunamad\u0131.\")\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>AuthenticationState<\/code> hem genel durumlar\u0131 (<code>Idle<\/code>, <code>Loading<\/code>) hem de daha spesifik, kendi i\u00e7lerinde sealed olan <code>Authenticated<\/code> ve <code>Error<\/code> durumlar\u0131n\u0131 i\u00e7erir. Bu yap\u0131, durum y\u00f6netimini \u00e7ok daha detayl\u0131 ve okunabilir hale getirir.<\/p>\n<h3>Generics ile Kullan\u0131m (Using with Generics)<\/h3>\n<p>Sealed s\u0131n\u0131flar, generic tiplerle birlikte kullan\u0131ld\u0131\u011f\u0131nda daha da esnek hale gelir. Bu, farkl\u0131 veri tipleriyle \u00e7al\u0131\u015fabilen genel durum veya sonu\u00e7 yap\u0131lar\u0131 olu\u015fturman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-kotlin\">sealed class AsyncResult<out T> {\n    object Loading : AsyncResult<Nothing>()\n    data class Success<out T>(val data: T) : AsyncResult<T>()\n    data class Failure(val exception: Throwable) : AsyncResult<Nothing>()\n}\n\nfun processGenericResult(result: AsyncResult<String>) {\n    when (result) {\n        AsyncResult.Loading -> println(\"Veri bekleniyor...\")\n        is AsyncResult.Success -> println(\"Ba\u015far\u0131l\u0131 veri: ${result.data}\")\n        is AsyncResult.Failure -> println(\"Hata olu\u015ftu: ${result.exception.localizedMessage}\")\n    }\n}\n\n\/\/ Kullan\u0131m\nfun main() {\n    processGenericResult(AsyncResult.Success(\"Generic Ba\u015far\u0131\"))\n    processGenericResult(AsyncResult.Failure(RuntimeException(\"Generic Hata\")))\n}<\/code><\/pre>\n<p>Burada <code>AsyncResult<out T><\/code> generic bir sealed s\u0131n\u0131ft\u0131r. <code>out T<\/code> kullan\u0131m\u0131 (kovaryans), <code>AsyncResult<String><\/code>&#8216;in bir <code>AsyncResult<Any><\/code> yerine ge\u00e7ebilmesini sa\u011flar ve daha fazla tip esnekli\u011fi sunar.<\/p>\n<h3>Kotlin 1.5 ve Sonras\u0131 De\u011fi\u015fiklikler<\/h3>\n<p>Daha \u00f6nce de bahsedildi\u011fi gibi, Kotlin 1.5 s\u00fcr\u00fcm\u00fcyle birlikte <code>sealed<\/code> s\u0131n\u0131flar\u0131n alt s\u0131n\u0131flar\u0131n\u0131 tan\u0131mlama k\u0131s\u0131tlamas\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde gev\u015fetildi.<\/p>\n<p>*   <strong>\u00d6ncesi:<\/strong> T\u00fcm do\u011frudan alt s\u0131n\u0131flar, <code>sealed<\/code> s\u0131n\u0131f\u0131n tan\u0131mland\u0131\u011f\u0131 <strong>ayn\u0131 <code>.kt<\/code> dosyas\u0131<\/strong> i\u00e7inde olmal\u0131yd\u0131.<br \/>\n*   <strong>Sonras\u0131 (Kotlin 1.5+):<\/strong> Do\u011frudan alt s\u0131n\u0131flar, <code>sealed<\/code> s\u0131n\u0131f\u0131n tan\u0131mland\u0131\u011f\u0131 <strong>ayn\u0131 derleme birimi (module)<\/strong> i\u00e7inde herhangi bir dosyada ve herhangi bir pakette tan\u0131mlanabilir.<\/p>\n<p>Bu de\u011fi\u015fiklik, b\u00fcy\u00fck projelerde sealed s\u0131n\u0131flar\u0131n kullan\u0131m\u0131n\u0131 \u00e7ok daha pratik hale getirmi\u015ftir. Art\u0131k ilgili alt s\u0131n\u0131flar\u0131 kendi dosyalar\u0131na veya paketlerine ay\u0131rarak kod taban\u0131n\u0131 daha d\u00fczenli tutmak m\u00fcmk\u00fcnd\u00fcr. Bu, mod\u00fclerli\u011fi art\u0131r\u0131r ve dosya boyutlar\u0131n\u0131 y\u00f6netilebilir k\u0131lar, \u00f6zellikle \u00e7ok say\u0131da alt s\u0131n\u0131f\u0131 olan sealed hiyerar\u015filerinde b\u00fcy\u00fck bir kolayl\u0131k sa\u011flar. Bu gev\u015feme, sealed s\u0131n\u0131flar\u0131n derleme zaman\u0131 kapsaml\u0131l\u0131k kontrol\u00fc gibi temel faydalar\u0131n\u0131 korurken, geli\u015ftirici deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirmi\u015ftir.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Kotlin&#8217;deki <code>sealed<\/code> s\u0131n\u0131flar, modern yaz\u0131l\u0131m geli\u015ftirmede kar\u015f\u0131la\u015f\u0131lan yayg\u0131n sorunlara zarif ve etkili \u00e7\u00f6z\u00fcmler sunan g\u00fc\u00e7l\u00fc bir dil \u00f6zelli\u011fidir. Durumlar\u0131n, olaylar\u0131n veya s\u0131n\u0131rl\u0131 t\u00fcr hiyerar\u015filerinin tip g\u00fcvenli, okunabilir ve bak\u0131m\u0131 kolay bir \u015fekilde temsil edilmesini sa\u011flarlar. \u00d6zellikle <code>when<\/code> ifadelerinde derleme zaman\u0131 kapsaml\u0131l\u0131k garantisi sunmalar\u0131, geli\u015ftirici hatalar\u0131n\u0131 azalt\u0131r ve kod refactoring&#8217;ini \u00e7ok daha g\u00fcvenli hale getirir.<\/p>\n<p><code>Enum<\/code> s\u0131n\u0131flar\u0131n\u0131n s\u0131n\u0131rlamalar\u0131n\u0131 a\u015farak her bir durumun kendi verisini ta\u015f\u0131mas\u0131na olanak tan\u0131mas\u0131 ve soyut s\u0131n\u0131flar\u0131n\/aray\u00fczlerin esnekli\u011fini kontroll\u00fc bir kal\u0131t\u0131m mekanizmas\u0131yla birle\u015ftirmesi, <code>sealed<\/code> s\u0131n\u0131flar\u0131 Kotlin ekosisteminde vazge\u00e7ilmez bir ara\u00e7 haline getirir. UI durum y\u00f6netimi (\u00f6rne\u011fin, Android&#8217;de MVI veya MVVM mimarilerinde), a\u011f isteklerinin sonu\u00e7lar\u0131n\u0131 modelleme, hata i\u015fleme ve domain&#8217;e \u00f6zg\u00fc d\u0131\u015flanm\u0131\u015f hiyerar\u015filer olu\u015fturma gibi bir\u00e7ok alanda yayg\u0131n olarak kullan\u0131l\u0131rlar.<\/p>\n<p>Kotlin 1.5 ile gelen &#8220;ayn\u0131 mod\u00fcl&#8221; k\u0131s\u0131tlamas\u0131n\u0131n gev\u015fetilmesi, <code>sealed<\/code> s\u0131n\u0131flar\u0131n daha b\u00fcy\u00fck ve karma\u015f\u0131k projelerde mod\u00fclerli\u011fi art\u0131rarak kullan\u0131m\u0131n\u0131 daha da kolayla\u015ft\u0131rm\u0131\u015ft\u0131r. Bu \u00f6zellik, temiz mimariler olu\u015fturmak, kodu daha anla\u015f\u0131l\u0131r k\u0131lmak ve uzun vadede yaz\u0131l\u0131m kalitesini art\u0131rmak isteyen her Kotlin geli\u015ftiricisinin ara\u00e7 setinde bulunmas\u0131 gereken bir yap\u0131d\u0131r. Sealed s\u0131n\u0131flar\u0131 do\u011fru bir \u015fekilde anlamak ve uygulamalar\u0131n\u0131za entegre etmek, daha g\u00fcvenilir ve bak\u0131m\u0131 kolay uygulamalar geli\u015ftirmenizin anahtar\u0131 olacakt\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber\nSealed S\u0131n\u0131flara Giri\u015f\nKotlin, modern yaz\u0131l\u0131m geli\u015ftirmenin ihtiya\u00e7lar\u0131na cevap veren g\u00fc\u00e7","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-35022","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber  Sealed S\u0131n\u0131flara Giri\u015f Kotlin, modern yaz\u0131l\u0131m geli\u015ftirmenin ihtiya\u00e7lar\u0131na cevap veren g\u00fc\u00e7\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-24T20:41:00+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-11-24T20:41:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/\"},\"wordCount\":3989,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/\",\"name\":\"Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-24T20:41:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber","og_description":"Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber  Sealed S\u0131n\u0131flara Giri\u015f Kotlin, modern yaz\u0131l\u0131m geli\u015ftirmenin ihtiya\u00e7lar\u0131na cevap veren g\u00fc\u00e7","og_url":"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-24T20:41:00+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber","datePublished":"2025-11-24T20:41:00+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/"},"wordCount":3989,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/","name":"Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-24T20:41:00+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/kotlin-sealed-siniflar-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Kotlin Sealed S\u0131n\u0131flar: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35022","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=35022"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35022\/revisions"}],"predecessor-version":[{"id":35023,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35022\/revisions\/35023"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}