All-open
- Kotlin kursu
- Uzman
- Ders 16/47
- 5 dk
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
// Entity ve UserEntity sınıflarını ekle
fun main() {
// çokbiçimli çağrıyı yazdır
}Örnek çözüm
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
____ class Entity(val id: Int) {
open fun describe(): String = "Entity #$id"
}
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 |