Angenommen, ich habe eine Klasse 'Anwendung'. Um initialisiert zu werden, benötigt es bestimmte Einstellungen im Konstruktor. Nehmen wir an, dass die Anzahl der Einstellungen so groß ist, dass es zwingend ist, sie in eine eigene Klasse zu stellen."Öffentliche" verschachtelte Klassen oder nicht
Vergleichen Sie die folgenden zwei Implementierungen dieses Szenarios.
Implementierung 1:
class Application
{
Application(ApplicationSettings settings)
{
//Do initialisation here
}
}
class ApplicationSettings
{
//Settings related methods and properties here
}
Implementierung 2:
class Application
{
Application(Application.Settings settings)
{
//Do initialisation here
}
class Settings
{
//Settings related methods and properties here
}
}
Für mich ist der zweite Ansatz sehr viel besser. Es ist lesbarer, weil es die Beziehung zwischen den beiden Klassen stark betont. Wenn ich Code schreibe, um die Application-Klasse irgendwo zu instanziieren, wird der zweite Ansatz hübscher aussehen.
Nun stellen Sie sich vor, dass die Settings-Klasse selbst ihrerseits eine ähnlich "verwandte" Klasse hatte und diese Klasse wiederum auch. Gehen Sie nur drei solche Ebenen und die Klassenbenennung kommt im "nicht verschachtelten" Fall außer Kontrolle. Wenn Sie nisten, bleiben die Dinge dennoch elegant.
Trotz der oben genannten habe ich Leute gelesen, die auf StackOverflow sagen, dass verschachtelte Klassen nur dann gerechtfertigt sind, wenn sie für die Außenwelt nicht sichtbar sind; das heißt, wenn sie nur für die interne Implementierung der enthaltenden Klasse verwendet werden. Der häufig angeführte Einwand ist, die Größe der Quelldatei der enthaltenen Klasse aufzublähen, aber partielle Klassen sind die perfekte Lösung für dieses Problem.
Meine Frage ist, warum sind wir vorsichtig mit der "öffentlich exponierten" Verwendung von geschachtelten Klassen? Gibt es andere Argumente gegen eine solche Verwendung?
Ich musste vor kurzem einen Builder-Code schreiben und erinnerte mich an diesen Beitrag. Es hat sich als sehr nützlich erwiesen, danke. –
* "Erlaubt auch dem Builder Zugriff auf private Mitglieder der äußeren Klasse" * Nur mit einer expliziten Referenz, korrekt (ich bin mir ziemlich sicher, dass es nicht implizit ist wie es in den inneren Klassen von Java ist). – samosaris
@SamusArin: Ja, es gibt keinen impliziten Verweis auf eine Instanz der enthaltenden Klasse. Sie haben aber auch Zugriff auf statische Mitglieder. Grundsätzlich habe ich * nur * über Zugänglichkeit gesprochen. –