ProgramlamaBackend geliştirici

Kotlin'de iç içe (nested) ve iç (inner) sınıfların tanımı ve kullanımıyla ilgili özellikleri açıklayınız. Ne zaman kullanılmaları gerektiğini, Java'daki iç içe sınıflardan farklarını ve olası tuzakları nelerdir?

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

Cevap.

Kotlin'de iç içe (nested) ve iç (inner) sınıflar, dış sınıf içinde işlevselliğin mantıksal gruplanması ve kapsüllenmesi için kullanılır.

Konunun Geçmişi

İç içe sınıf fikri, Java'dan, kodu yapılandırma ve yardımcı bileşenleri ana sınıf içinde izole etme yolu olarak geldi. Kotlin'de sözdizimi ve yaklaşım Java'dan miras alınmıştır, ancak önemli farklılıklarla.

Sorun

Ana hedef, bir dış sınıfın bağlamında var olmaları gerekmeyen yardımcı sınıfları mantıklı bir şekilde ayırmak, ancak dış sınıfın üyelerine farklı erişim derecelerinin sağlanmasıdır. Java'da varsayılan olarak iç içe sınıf bir inner class'tır, Kotlin'de varsayılan olarak nested (statik) sınıftır.

Çözüm

Kotlin'de, bir sınıfın başka bir sınıf içinde tanımlanması varsayılan olarak statik (nested) sınıf oluşturur, yani bu sınıf dış sınıfın üyelerine erişemez. Erişim sağlamak için inner anahtar kelimesi kullanılır.

Kod örneği:

class Outer { private val secret = "dışarıda" class Nested { fun call() = "nested: Outer.secret'e erişim yok" } inner class Inner { fun call() = "inner: $secret'e erişim var" } }

Ana özellikler:

  • İç içe sınıf (class Nested) varsayılan olarak dış sınıfın örneğine referans içermez;
  • İç sınıf (inner class Inner) dış sınıfın üyelerine, hatta özel olanlara bile ulaşabilir;
  • İç sınıfın başlatılması, dış sınıfın bir örneğini gerektirir.

Soran Sorular.

Bir iç içe (nested) sınıf dış sınıfın özel bir özelliğine erişebilir mi?

Hayır, iç içe sınıf (varsayılan olarak) Kotlin'de statik olduğundan ve dış sınıfa referans içermediğinden, onun özelliklerine ve yöntemlerine erişemez.

Kotlin'deki iç sınıflarla Java'daki iç sınıflar arasındaki fark nedir?

Java'da iç içe sınıf varsayılan olarak statik değildir ve dış sınıfa bir referans içerir. Kotlin'de ise; iç içe sınıf statik, sadece iç sınıf dış örneğine referans alır.

Bir iç sınıf nesne (object) içinde tanımlanabilir mi?

Hayır, iç sınıf (inner) object içinde tanımlanamaz, çünkü object örneklendirilemez.

Tipik hatalar ve anti-paternerler

  • Dış sınıfa erişim gerekmeyen yerlerde iç (inner) sınıf tanımlamak - aşırı bağlılık yaratma;
  • İç içe sınıftan dış sınıfın üyelerine erişim hatası; derleme hatası;
  • İç sınıf üzerinden dış sınıfın gizli referansları sayesinde hafıza sızıntılarına neden olma.

Gerçek Hayat Örneği

Olumsuz Durum

Geliştirici, dış sınıfın özelliklerini kullanmayan bir inner-sınıf tanımlar:

class Container { inner class Helper { fun help() = "help" } }

Artılar:

Dış nesneden sınıfa erişmek kolay.

Eksiler:

  • Gereksiz bağlılık.
  • Container'a gizli referans nedeniyle olası hafıza sızıntıları.

Olumlu Durum

Dış sınıfın özel durumuna erişim sağlamak için inner-sınıf kullanımı:

class Auth { private var token: String = "" inner class TokenManager { fun updateToken(new: String) { token = new } } }

Artılar:

  • Özel özelliklere tam erişim kontrolü;
  • Kapsüllemeyi koruma.

Eksiler:

  • Test edilebilirliği zorlaştırır;
  • Dış sınıfa bağımlılıktan kaçınılması gereken durumlarda kullanılmamalıdır.