Sabitlerin bildirilmesi ve companion object kullanımı, Java'daki alışılmış static üyelerin yerini alan ve OOP ile fonksiyonel programlama paradigmalarının kesişimindeki zorluklarla ilgili önemli Kotlin kavramlarıdır.
Meselenin Tarihi: Java'da sabitler genellikle static final alanlar kullanılarak tanımlanır. Statik yöntemler, yardımcı veya fabrika işlevleri içindir. Kotlin'de static yerine object ve companion object tanıtıldı ve compile-time sabitler için const anahtar kelimesi eklendi.
Sorun: Sınıf örneğinden bağımsız değerleri tanımlamak ve statik durumu, OOP bütünlüğünü ihlal etmeden organize etmek gerekiyor.
Çözüm: Companion object'lar, sınıf içinde bildirilir ve tüm örnekler için ortak üyeleri içermeyi sağlar:
Kod örneği:
class MyClass { companion object { const val DEFAULT_LIMIT = 10 fun create(): MyClass = MyClass() } } val limit = MyClass.DEFAULT_LIMIT val instance = MyClass.create()
Anahtar özellikler:
Bir sınıfta birden fazla companion object olabilir mi?
Hayır, bir sınıfta yalnızca bir companion object bulunabilir. İkincisini bildirmeye çalışmak, derleme hatasına yol açar. Ancak companion object içinde herhangi bir sayıda yöntem/özellik tanımlanabilir.
Companion object içinde lateinit değişkenler başlatılabilir mi?
Hayır, çünkü const ile özellikler ya da companion object içindeki değişkenlerin hemen başlatılması ya da açık başlatma ile val/var olması zorunludur. lateinit, companion object içindeki özellikler için geçerli değildir.
Companion object kendi ismine sahip olabilir mi ve bu ne zaman gereklidir?
Evet, companion object ismi açıkça belirlenebilir, eğer ona ismiyle erişilmesi ya da örneğin arayüzleri uygulaması gerekiyorsa. Diğer durumlarda isteğe bağlıdır. Örnek:
class Foo { companion object Factory { fun create(): Foo = Foo() } } val instance = Foo.Factory.create()
Tüm yardımcı işlevler ve programın küresel değişkenleri companion object içinde yer alır, var yerine değişken kullanılır:
Artılar:
Eksiler:
Sadece compile-time sabitleri (const val) ve čist fonksiyonlar companion object içinde kullanılır, tüm değişkenler ya yerel ya da DI aracılığıyla iletilir:
Artılar:
Eksiler: