8 Stimmen

guter Programmierstil, zwei Klassen, die die inneren Klassen der jeweils anderen verwenden

Ich habe die Klasse A, deren innere Klasse als A1 definiert ist, und die Klasse B, deren innere Klasse als B1 definiert ist. Ist es Ihrer Meinung nach in Ordnung, dass Klasse A in ihrer Implementierung auf B1 und Klasse B auf A1 verweist? Ist das nicht ein schlechter Programmierstil? Es ist nur so, dass A1 eine sehr A-spezifische Klasse ist und B1 eine sehr B-spezifische, deshalb habe ich sie gekoppelt. Ist es in Ordnung, das so zu lassen, oder ist es besser, A1 und B1 als separate Klassen zu haben? Was meint ihr dazu? Vielen Dank!

0 Stimmen

Allein aufgrund der von Ihnen gemachten Angaben kann ich nicht erkennen, inwiefern das einen Unterschied machen kann.

6voto

TS- Punkte 4131

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

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

Sehen Sie sich diesen Beitrag an Warum/wann sollten Sie verschachtelte Klassen verwenden? "Verwenden Sie eine verschachtelte Klasse, wenn die Klasse, die Sie verschachteln, nur für die umschließende Klasse nützlich ist".

0 Stimmen

Ja, aber der Beitrag, auf den Sie sich beziehen, ist für .NET... Ich weiß nicht, über alle .NET, aber zumindest in C #, verschachtelte Klassen sind eine nicht annähernd so mächtig wie Java's innere Klassen. Zum Beispiel hat eine verschachtelte C#-Klasse keinen Zugriff auf die nicht-statischen Methoden der äußeren Klasse ohne einen expliziten Verweis auf eine Instanz. Ich glaube also nicht, dass dieser Link direkt übersetzbar ist.

0 Stimmen

Ja, aber es bietet dennoch eine allgemeine konzeptionelle Sicht, die für alle OO-Konzepte gilt.

0 Stimmen

Siehe meine Antwort unten... IMO sind verschachtelte Klassen meist verwendet, um sprachliche Besonderheiten auszunutzen/zu nutzen.

6voto

Luis Miguel Serrano Punkte 4929

Ich glaube, wenn Sie in einer Ihrer Klassen auf innere Klassen einer anderen Klasse verweisen müssen, liegt das daran, dass möglicherweise die Klasse, die die innere Klasse enthält, einige Methoden bereitstellen 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 als solche eine unabhängige Klasse sein, die wahrscheinlich Teil desselben Pakets sein sollte, das ihren Anwendungskontext/Verwendungszweck angibt.

0 Stimmen

@Luis aber die grundlegende Prämisse der Verwendung einer inneren Klasse ist, dass es nicht von einer anderen Klasse benötigt werden, dann wie kommen es ist eine gute Praxis? korrigieren Sie mich, wenn ich falsch bin.

0 Stimmen

Das habe ich auch gesagt. Eine innere Klasse sollte nur von ihrer übergeordneten Klasse verwendet werden. Und es ist eine gute Praxis, sie in diesem Kontext zu verwenden, weil sie eine bessere Kapselung und Organisation Ihres Codes und der Konzepte, die Sie darstellen, ermöglicht. Wenn Sie diesen Code an anderer Stelle verwenden müssen, dann ist er nicht als innere Klasse gedacht.

2voto

Vladimir Ivanov Punkte 42019

Ich würde möglicherweise zwei Dinge versuchen:

  1. Verschieben Sie die inneren Klassen in die separaten Klassen, da sie logischerweise nicht mehr inner sind.

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

1voto

helpermethod Punkte 54839

Ich würde sagen, wenn beide Klassen im gleichen Paket sind, extrahieren Sie die inneren Klassen und machen Sie sie package private. 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.

1voto

Dilum Ranatunga Punkte 13094

Ich glaube, Sie haben zwei verschiedene Designfragen in einer gestellt. Die erste Frage bezieht sich auf den Verweis auf die inneren Klassen einer anderen Klasse. Bei der zweiten Frage geht es um die zirkuläre Abhängigkeit zwischen A/A1 und B/B1.

Ausgesetzte innere Klassen

Es gibt viele Gründe für die Verwendung von Java inneren Klassen.

  1. Gruppierung von Klassen, die nur für einander und die äußere Klasse relevant sind. (auch bekannt als Mini-Paket)
  2. Verringerung von "Boilerplate"-Code bei der Übergabe und dem Verweis auf äußere Klasseninstanzen
  3. Hinzufügen einer zusätzlichen Ebene des Scopings über das Paket hinaus
  4. Erweiterung der Semantik von Javas Zugriffsbereich... zum Beispiel, private hat eine andere Bedeutung für Interaktionen zwischen äußeren und inneren Klassen.
  5. Reduzieren Sie die Explosion von Quelldateien... insbesondere in Szenarien der (Quell-)Codegenerierung.
  6. Zugriff auf die Interna der äußeren Klasse zum Testen (die innere Klasse kann beim Packen des JAR entfernt werden).

In vielen dieser Fälle ist es durchaus sinnvoll, die innere Klasse beim Namen zu nennen.

Kreislaufabhängigkeit

Dies ist eher ein Anzeichen dafür, dass Schnittstellen oder andere spezialisierte Klassen extrahiert werden müssen. Wenn A1, B1 zu einfach sind, um Schnittstellen usw. 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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X