ProgramlamaBackend Geliştirici

Kotlin'de sabitlerin ve companion object'ların (eşlik eden nesnelerin) bildirilmesi ve kullanımıyla ilgili özellikleri, kısıtlamaları ve nüansları tanımlayın.

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

Yanıt.

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:

  • Companion object içindeki her şey, Java'daki static üyeler gibi davranır, ancak OOP entegrasyonu ve kalıtım/arayüzler olanağını korur
  • Companion object içinde compile-time sabitler için const etiketi zorunludur
  • Eşlik eden nesne kendisi bir nesne olarak erişilebilir (referans saklanabilir) ve arayüzleri uygulayabilir

Kandırmaca Soruları.

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()

Tipik Hatalar ve Anti-Desenler

  • Companion object içinde mutable statik değişkenler kullanmak — çoklu iş parçacığı kodunda yarış koşuluna yol açabilir
  • Compile-time sabitleri (const) ve runtime değerleri bir nesnede karıştırmak
  • Yalnızca file-level fonksiyonlar/özellikler yeterliyken gereksiz companion object'lar tanımlamak

Hayattan Bir Örnek

Olumsuz Durum

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:

  • Tüm "statik" fonksiyonlar ve değişkenler aynı yerde, kolayca bulunabilir.

Eksiler:

  • Test etme zorlukları, durum küresel ve başka bir kod parçasında istemeden değiştirilebilir.

Olumlu Durum

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:

  • Öngörülebilir ve güvenli kod, net mimari, kapsülleme seviyesi artar.

Eksiler:

  • Bazen küresel yardımcılar için file-level nesneler oluşturmak gerekir, biraz daha fazla boilerplate gereklidir.