Ist es vernünftig, Java innere Klassen mehr als eine Ebene tief zu verschachteln?

9

Kushal Paudyal fragte wie tief du innerlich nisten kannst Klassen in Java. Der Konsens ist, dass, während die Sprache selbst kein Limit auferlegt, das zugrunde liegende Betriebssystem und Dateisystem zugrunde liegen kann.

Haben Sie jemals einen Fall gefunden, in dem zwei oder mehr Ebenen von verschachtelten inneren Klassen hilfreich sind?

Update (11/28): Wenn Sie Enum-Klassen in Betracht ziehen, kann eine zweite Verschachtelungsebene sinnvoll sein. Während einer kürzlichen Refactoring-Sitzung hatte ich kurz eine äußere Klasse (einen HTTP-Client), eine innere Klasse (einen speicherinternen Cache) und innerhalb der inneren Klasse eine enum-Klasse (für die Cache-Räumungsstrategien). Das schien in Ordnung zu sein, aber zu @ Thorbjørns Punkt fuhr ich fort, indem ich die Cache-Klasse und ihre innere Aufzählung aus der HTTP-Client-Klasse extrahierte.

    
Jim Ferrans 23.11.2009, 21:25
quelle

6 Antworten

4

Nein. Ich habe nicht.

Das Standardbeispiel einer Klasse innerhalb einer Klasse ist der Builder, in dem Sie eine Unterklasse haben, die Ihnen hilft, eine richtige Instanz mit vielen möglichen Konfigurationsmethoden zu erstellen.

Persönlich würde ich einen komplexeren Fall von verschachtelten Klassen als ein hervorragendes Beispiel für Code betrachten, der Refactoring benötigt.

    
Thorbjørn Ravn Andersen 23.11.2009, 21:45
quelle
3

Ich bin persönlich nicht auf einen Fall gestoßen, bei dem sich mehr als einer als notwendig erwiesen hat. Ich könnte einen Fall vorhersehen, wo zwei sich als nützlich erweisen könnten. Ich habe jedoch Schwierigkeiten, mir mehr als zwei vorzustellen.

Das Beispiel, das ich mir vorstelle, ist Java-GUI-Code. Unter bestimmten Umständen kann es sinnvoll sein, eine Klasse in einem bereits verschachtelten ActionListener zu verschachteln.

    
Daniel Bingham 23.11.2009 21:29
quelle
2

Wenn Sie aus einigen Daten Code generieren, können verschachtelte Klassen eine gute Möglichkeit zur Vermeidung von Namenskonflikten sein.

    
Jimmy 23.11.2009 23:04
quelle
2

Ich habe die Anzahl der Ebenen der geschachtelten Klassen verwendet.

Es gibt eine Legacy-Maschine namens Tandem (von HP), die ursprünglich Code von COBOL / C ausführt. Es gibt später "Patches", die diesen Rechner auch zum Ausführen von Java aktivieren. Die Variablenstruktur von COBOL ist natürlich mehrstufig (sogar 5 Stufen sind ein häufiger Fall). Um Java den Aufruf von COBOL-Servern zu ermöglichen, wurden die Java-Klassen ebenfalls multi-leveled, um die Konvertierung der Daten zwischen ihnen zu vereinfachen .

Ich stimme zu, dass dies ein sehr ungewöhnlicher Fall ist, aber trotzdem ...

    
jutky 23.11.2009 23:33
quelle
2

Ich weiß, dass ich einen alten Thread recycle, aber er ist neu für mich:)

Wir verwenden mehrere Ebenen für unsere POJOs zum Deserialisieren von JSON (mit Jackson). Hier ist ein kleines Beispiel für JSON, das wir möglicherweise von einem REST-fähigen Web-Service erhalten haben:

%Vor%

Früher haben wir POJOs eingerichtet wie:

%Vor%

Wir haben viele davon mit einem POJO für jede Web-Service-Anfrage, die wir machen könnten. Dieses Layout gab uns ein paar nagelnde Zweifel:

  1. Beachten Sie, dass dieses eine relativ einfache Beispiel vier Klassendateien enthält, mit denen wir Schritt halten können. Multiplizieren Sie das nun mit 100s und dann mit einem "Schwierigkeitsfaktor" von 3, um der Tatsache Rechnung zu tragen, dass der meiste JSON viel unordentlicher ist. Tausende von Dateien.

  2. Die Feldnamen werden überall wiederverwendet, und derselbe Feldname kann auf der Grundlage des jeweiligen Webdienstes unterschiedliche Inhalte haben. (Stellen Sie sich vor, die Mengen könnten als Strings von einem Web-Service zurückkommen, int von einem anderen, dann multiplizieren Sie diesen Wert mit 100s.)

Da diese Dinge in einer Eltern-Kind-Beziehung zusammenhängen, haben wir uns stattdessen für dieses Layout entschieden.

%Vor%

In diesem Fall bin ich zwei tief verschachtelt, aber es könnte mehr sein. Vielleicht bis zu vier.

    
bobanahalf 14.08.2015 15:26
quelle
1

Sicher - das ist manchmal gültig. Ich habe das vor ein paar Minuten gemacht.

In einem Testcode, den ich geschrieben habe, wollte ich zum Beispiel ein Muster erstellen, das mehrere Callables verarbeitet. Der Textbaustein, der benötigt wird, um mehrere Instanzen eines aufrufbaren Codeblocks zu erstellen. In diesem Beispiel erstelle ich eine Instanz einer Factory, die an threadedTest übergeben wird, und diese Factory erstellt neue Callables.

%Vor%

Viel prägnanter als das Erstellen von zwei neuen Klassen, in denen die eine die andere erstellt. Natürlich gibt es hier eine Lesbarkeitsnacht, bis Sie an den Stil gewöhnt sind, obwohl ...

Wenn Sie dies mit einer Template-Methode kombinieren, um Transaktionen oder Datenbank-Connect / Close zu steuern, könnte dies zu drei Tiefen führen. (Ich hatte einen solchen Code; wenn Sie es tun, stellen Sie sicher, dass Sie ein Dummy-Beispiel in Ihre Kommentare schreiben und die Struktur gut erklären)

    
Scott Stanchfield 23.11.2009 23:01
quelle

Tags und Links