Geneste (nested) en interne (inner) klassen in Kotlin worden gebruikt voor logische groepering en encapsulatie van functionaliteit binnen de externe klasse.
Het idee van geneste klassen komt uit Java als een manier om de code te structureren en hulpelementen binnen de hoofklasse te isoleren. In Kotlin zijn de syntaxis en benadering overgenomen van Java, maar met belangrijke verschillen.
De belangrijkste taak is om hulpklassen correct te scheiden waar ze niet buiten de context van de externe klasse moeten bestaan, maar toch een verschillende mate van toegang tot de leden van de externe klasse vereisen. In Java is een geneste klasse standaard een inner class, in Kotlin is dit standaard nested (statisch).
In Kotlin creëert het declareren van een klasse binnen een andere klasse standaard een statische (nested) klasse, wat betekent dat deze klasse geen toegang heeft tot de leden van de externe klasse. Toegang krijg je met het sleutelwoord inner.
Voorbeeldcode:
class Outer { private val secret = "outside" class Nested { fun call() = "nested: geen toegang tot Outer.secret" } inner class Inner { fun call() = "inner: kan toegang krijgen tot $secret" } }
Belangrijke kenmerken:
class Nested) heeft standaard geen verwijzing naar de instantie van de externe klasse;inner class Inner) heeft een verwijzing en kan toegang krijgen tot de leden van de externe klasse, zelfs tot privés;Kan een geneste (nested) klasse toegang krijgen tot een privé-eigenschap van de externe klasse?
Nee, de geneste klasse (standaard) is statisch in Kotlin en bevat geen verwijzing naar de externe klasse, dus heeft geen toegang tot zijn eigenschappen en methoden.
Wat is het verschil tussen inner-klassen in Kotlin en Java?
In Java is een geneste klasse standaard niet statisch en heeft het een verwijzing naar de externe. In Kotlin is het omgekeerd; de geneste klasse is statisch, alleen de inner-klasse krijgt een verwijzing naar de externe instantie.
Kan een interne klasse in een object (object) worden gedeclareerd?
Nee, een interne klasse (inner) kan niet binnen een object worden gedeclareerd, omdat een object niet kan worden geïnstantieerd.
Een ontwikkelaar declareert een inner-klasse die geen eigenschappen van de externe klasse gebruikt:
class Container { inner class Helper { fun help() = "help" } }
Voordelen:
De klasse kan eenvoudig vanuit het externe object worden verkregen.
Nadelen:
Gebruik van een inner-klasse om toegang te krijgen tot de privé-status van de externe klasse:
class Auth { private var token: String = "" inner class TokenManager { fun updateToken(new: String) { token = new } } }
Voordelen:
Nadelen: