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.
İç 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.
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.
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:
class Nested) varsayılan olarak dış sınıfın örneğine referans içermez;inner class Inner) dış sınıfın üyelerine, hatta özel olanlara bile ulaşabilir;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.
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:
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:
Eksiler: