CodeBlanks Logo Icon CodeBlanks

All-open

all-open compiler plugin'ını öğrenirsin.

All-open plugin'i

all-open plugin'i, belirli annotation'lara sahip Kotlin sınıflarını derleme sırasında open yapar. Bu, framework proxy'leri için gereklidir.

Spring'in @Configuration, @Service gibi annotation'ları CGLIB proxy'si ister; bu da sınıfın open olmasını gerektirir. Kotlin'de sınıflar varsayılan final'dir. all-open plugin'i open-for-annotation bağımlılığıyla eklenir ve hangi annotation'ların open yapacağını Gradle'da bildirirsin. Böylece sınıfı elle open yapmana gerek kalmaz. Bu, Spring ve Micronaut projelerinde standart bir kurulumdur.

All-open örneği

Bu derste all-open plugin'inin yaptığını elle gösteriyoruz. Normalde plugin open'i otomatik ekler; biz modelliyoruz.

Örnek: open class Entity(val id: Int) { open fun describe(): String = "Entity #$id" }. Sonra class UserEntity(id: Int) : Entity(id) { override fun describe(): String = "User #$id" }. Burada Entity açık; UserEntity ondan kalıtım alıp describe'ı geçersiz kılıyor. val e: Entity = UserEntity(42) ataması çokbiçimlilik sağlar; e.describe() alt sınıfın sürümünü çağırır.

Uygulama Entity + UserEntity yaz

open class Entity(val id: Int) tanımla; open fun describe(): String = "Entity #${'$'}id" metodu olsun. class UserEntity(id: Int) : Entity(id) tanımla; override fun describe(): String = "User #${'$'}id" metodu olsun. main içinde val e: Entity = UserEntity(42) ve println(e.describe()) yaz.

Başlangıç kodu

Main.kt
// Entity ve UserEntity sınıflarını ekle

fun main() {
    // çokbiçimli çağrıyı yazdır
}

Örnek çözüm

Main.kt
open class Entity(val id: Int) {
    open fun describe(): String = "Entity #$id"
}
class UserEntity(id: Int) : Entity(id) {
    override fun describe(): String = "User #$id"
}
fun main() {
    val e: Entity = UserEntity(42)
    println(e.describe())
}

Beklenen çıktı

User #42

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 all-open neden kullanılır?

  • Sınıfı final yapmak için
  • Annotation eklemek için
  • CGLIB proxy için sınıfı open yapmak için Doğru cevap
  • IR'yi silmek için

Açıklama: Spring gibi framework'ler proxy için sınıfın open olmasını ister.

2 open anahtarını ekle

Soru
____ class Entity(val id: Int) {
    open fun describe(): String = "Entity #$id"
}
Cevap
open class Entity(val id: Int) {
    open fun describe(): String = "Entity #$id"
}

Açıklama: open sınıfın alt sınıfına izin verir.

3 All-open parçalarını eşle

Kavram Anlamı
open Kalıtımı açar
override Metodu geçersiz kılar
@Configuration Spring annotation
CGLIB Proxy kütüphanesi

Uzman bölümündeki tüm dersler