guter Programmierstil, zwei Klassen, die die inneren Klassen des jeweils anderen benutzen

8

Ich habe Klasse A mit seiner inneren Klasse definiert A1 und Klasse B mit seiner inneren Klasse B1 definiert. Halten Sie es für in Ordnung, dass Klasse A in ihrer Implementierung sich auf B1 und Klasse B auf A1 bezieht. Ist es nicht ein schlechter Programmierstil? Es ist nur A1 Eine sehr spezifische Klasse und B1 sehr spezifisch, deshalb habe ich sie gekoppelt. Ist es okay, es so zu lassen oder ist es besser, A1 und B1 als separate Klassen zu haben? Was denken Sie? Thx.

    
azerIO 20.05.2011, 13:29
quelle

5 Antworten

6

Ich glaube, dass, wenn Sie sich auf innere Klassen einer anderen Klasse in einer Ihrer Klassen beziehen müssen, weil möglicherweise die Klasse, die die innere Klasse enthält, einige Methoden zur Verfügung stellen sollte, um dieses Problem zu vermeiden.

Wenn das Problem nicht so ist, dann ist die innere Klasse wahrscheinlich generisch genug, um in beiden anderen Klassen verwendet zu werden, und sollte daher eine unabhängige Klasse sein, die wahrscheinlich Teil desselben Pakets sein sollte, das seinen Kontext spezifiziert der Anwendung / Verwendung.

    
Luis Miguel Serrano 20.05.2011, 13:35
quelle
6

Sie könnten - obwohl ich denke, dass der Sinn innerer Klassen darin liegt, dass sie innerhalb der äußeren Klassen verwendet werden sollten. Mit anderen Worten, ich bin kein großer Fan der öffentlichen inneren Klassen.

Ich würde A1 und B1 eigentlich als eigene Klasse herausstellen - mir scheint A1 und B1 nicht so spezifisch für A und B zu sein, da A1 von B benutzt wird und B1 von A benutzt wird.

Schauen Sie sich diesen Beitrag an Why / wann sollten Sie verschachtelte Klassen verwenden "Verwenden Sie eine verschachtelte Klasse, wenn die zu verschachtelnde Klasse nur für die einschließende Klasse nützlich ist"

    
TS- 20.05.2011 13:33
quelle
2

Ich würde möglicherweise versuchen, zwei Dinge:

  1. Verschiebe innere Klassen in separate, da sie nicht mehr logisch sind.

  2. Erstellen Sie einige Schnittstellen, damit A und B zumindest nicht wissen, wo die Klassen A1 und B1 sind.

Vladimir Ivanov 20.05.2011 13:36
quelle
1

Ich würde sagen, wenn beide Klassen im gleichen Paket sind, extrahiere die inneren Klassen und mache sie zu einem privaten Paket. Auf diese Weise können beide Klassen (A und B) auf sie verweisen, aber sie sind für andere Klassen außerhalb des Pakets unsichtbar.

    
helpermethod 20.05.2011 13:40
quelle
1

Ich denke, du hast zwei separate Designfragen in einem gestellt. Die erste Frage bezieht sich auf die inneren Klassen einer anderen Klasse. Die zweite Frage betrifft die zirkuläre Abhängigkeit zwischen A / A1 und B / B1.

Exponierte innere Klassen

Es gibt viele Gründe, Java innere Klassen zu verwenden.

  1. Gruppenklassen, die nur für die jeweils andere und die äußere Klasse relevant sind. (a.k.a Mini-Paket)
  2. Reduzieren Sie den Code im Vorbeigehen und verweisen Sie auf äußere Klasseninstanzen
  3. Fügen Sie ein zusätzliches Scoping-Level über das Paket hinaus
  4. hinzu
  5. Die Semantik des Java-Zugriffsbereichs wird erweitert ... zum Beispiel hat private eine andere Bedeutung für äußere Klassen - innere Klasseninteraktionen.
  6. Reduziere die Explosion von Quelldateien ... besonders in (Quell-) Codegenerierungsszenarien.
  7. Zugriff auf äußere Klasseninterna zum Testen (die innere Klasse kann beim Packen von JAR entfernt werden).

Unter vielen dieser Umstände ist die Bezugnahme auf die innere Klasse mit dem Namen durchaus sinnvoll.

Kreisförmige Abhängigkeit

Dies ist häufiger ein Anzeichen dafür, dass Schnittstellen extrahiert werden müssen oder andere spezialisierte Klassen extrahiert werden müssen. Wenn A1, B1 zu einfach sind, um Interfaces etc. zu extrahieren, dann können Sie vielleicht innere Klassen auf andere Weise verwenden: Haben Sie eine äußere Klasse C, die A1, B1 enthält.

    
Dilum Ranatunga 20.05.2011 14:06
quelle