ProgramlamaAndroid geliştirici

Kotlin'de sabitler ve nesneler arasındaki miras nasıl çalışır? Sabit özelliklerin (const val ve val) miras alınması ve derlenmesiyle ilgili gizli tehlikeler nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Kotlin'de const val modifikatörü yalnızca compile-time sabitler için kullanılır ve top-level (dosya seviyesinde) ya da nesnelerin (object) ve companion nesnelerin içinde tanımlanabilir. Sınıflar içinde val olarak tanımlanan özellikler, statik başlatma yapılmadan normal final property'ler haline gelir. Önemli bir özellik: const val miras alınamaz, ancak val yeniden tanımlanabilir (izin verilmişse).

Sabitler (const val) soyut olamaz çünkü derleme aşamasında bir değere sahip olmaları gerekir. Normal val, açılan özellikler aracılığıyla hiyerarşilerde sabit deseni uygulamaya izin verir, ancak çalışma zamanında, Java’daki derlemeden farklı olarak, getter aracılığıyla erişilebilir.

Örnek:

open class Base { open val info: String = "base" } class Child : Base() { override val info = "child" } object Constants { const val APPLICATION_NAME = "MyApp" }

Aldatıcı soru.

Bir arayüzde veya soyut sınıfta const val tanımlanabilir mi ve sonra yeniden tanımlayıp/miras alabilir miyiz?

Cevap ve örnek:

Hayır. Kotlin'de bir arayüz veya soyut sınıf içinde const val tanımlamak mümkün değildir — bu yalnızca nesne (object) ve top-level seviyesinde izin verilmektedir. Miras alınabilir static final değişkenler yoktur.

interface Foo { // const val X = "constant" // derleme hatası: const 'val' yalnızca top-level, nesnelerde veya companion nesnelerde izin verilir }

Bilgi eksikliğinden kaynaklanan gerçek hata örnekleri.


Hikaye

Takım, Android'deki birkaç modülde arayüz mirası aracılığıyla dize sabitlerini yeniden kullanmaya çalıştı ve bunları const val olarak tanımladığında, bir derleme hatası aldılar ve sabitleri top-level'a taşıdılar, bu kapsüllemeyi kötüleştirdi.


Hikaye

Projede, tüm Java static final alanlarını Kotlin val alanlarına dönüştürdüler ve benzer bir davranış beklediler (compile-time const), ancak bunlar normal property'ler haline geldi ve getter ile erişildi. Sonuç olarak erişim süresi arttı ve bu, mikro hizmet uygulamasındaki sıcak yolları olumsuz etkiledi.


Hikaye

Java'dan Kotlin'e constants/container sınıflarını taşırken, geliştiriciler sabitleri companion object içinde oluşturdu, ancak Java kodundan erişimle ilgili bir sorun yaşadılar: sabitler, sınıfın değil, companion'ın kendisi olarak alanlar olarak görünüyordu, bu da API'de karışıklığa ve ek uyumluluk hatalarına yol açtı.