Kotlin'de const val anahtar kelimesi, derleme zamanındaki sabitleri tanımlamak için kullanılır, yani derleme aşamasında bilinen ve hesaplanan değerlerdir.
const val yalnızca üst düzey değişkenler veya object nesneleri veya companion object tarafından tanımlanan özellikler için kullanılır.String, sayısal ilkel veya Boolean türünde olmalıdır.val ise değiştirilemeyen bir değişkendir, ancak değeri çalışma zamanında atanabilir; bu da başlatma sırasında hesaplamalara veya fonksiyon çağrılarına izin verir:
val timestamp = System.currentTimeMillis() // Bu bir const val DEĞİLDİR const val APP_NAME = "MyApp" // Bu bir derleme zamanı sabitidir
Anotasyonlarda yalnızca const val kullanılabilir, örnek:
const val AUTHOR = "John Doe" @Target(AnnotationTarget.CLASS) annotation class Author(val name: String) @Author(AUTHOR) class Example
Böyle durumlarda val kullanmaya çalışmak derleme hatasına yol açar.
Neden
const valnormal bir sınıf içinde tanımlanamaz?
Cevap: Çünkü const val değişkenin derleme zamanı erişilebilirliğini gerektirir, ancak sınıf örneği değişkenleri yalnızca nesne oluşturulurken başlatıldığı için derleme zamanı sabitleri olamazlar.
class Example { // Hata! Bu şekilde olamaz // const val CLASS_NAME = "MyClass" }
Tarih
Derleyici bozuldu çünkü bir geliştirici derleme zamanında hesaplanan bir değeri anotasyonla geçmeye çalıştı.
Geliştirici şöyle tanımladı:
val version = getVersionFromConfig() @Target(AnnotationTarget.CLASS) annotation class Version(val value: String) @Version(version) class App
Proje derlenmedi çünkü yalnızca const val anotasyon argümanlarında kullanılabilir!
Tarih
Android'de hata: Niyet içinde sabit anahtarlar olarak yerel değişkenleri kullanma girişimi.
class Keys { companion object { val EXTRA_USER_ID = "userId" } } intent.putExtra(Keys.EXTRA_USER_ID, userId)
Bazı araçlar veya çerçeveler, const val bekler, normal val değil — aksi takdirde IDE veya Android kaynakları bu değerleri derleme zamanı sabitleri olarak göremez.
Tarih
const val için uygun olmayan bir tür kullanımı.
const val LIST = listOf(1,2,3) // Hata! Sadece ilkel türler ve String.
Tür sınırlamalarının bilinmemesi derleme hatasına neden oldu ve zaman kaybına yol açtı.