Was ist der Zweck einer inneren Klasse?

8

Ich lese über innere Klassen in einer Schnittstelle und Klasse. Ich konnte den wirklichen Gebrauch nicht verstehen. Allerdings möchte ich in diesem Beitrag nichts über innere Klassen innerhalb einer Schnittstelle diskutieren.

Ich habe bis jetzt innere Klassen als Rückruf benutzt. Ich kann das gleiche auch außerhalb der Klasse erklären.

Angenommen, ich habe eine Liste von Schülern und möchte sie nach ID sortieren. Ich muss die Comparator-Schnittstelle implementieren und sie als Argument für die Sortiermethode von Collections bereitstellen.

%Vor%

Ich kann das auch so machen

%Vor%

Ich glaube nicht, dass die innere Klasse im obigen Beispiel eine signifikante Bedeutung hinzufügt, wenn sie nicht als private Klasse deklariert ist. Wenn ich es als privat deklariere, kann nur die einschließende Klasse es verwenden. Es bedeutet, dass die Klasse stark mit der einschließenden Klasse verbunden ist, und ich sehe einen gewissen Vorteil davon.

Kann mir jemand bitte die wahre Bedeutung / Bedeutung der Verwendung / Schreiben innerer Klassen in einer Anwendung erklären.

    
Krishna Chaitanya 26.11.2013, 03:56
quelle

7 Antworten

4

Sie sollten innere Klassen verwenden, wenn Sie etwas benötigen, das spezifisch für die Klasse ist, mit der Sie arbeiten. Ein gutes Beispiel für eine innere Klasse finden Sie hier: java.awt.geom.Ellipse2D und die entsprechende Ellipse2D.Double und Ellipse2D.Float ( Ellipse2D quelle code ). Sie könnten diese Klassen in einem Paket platzieren, aber sie machen viel mehr Sinn als verschachtelte Klassen. Sie entsprechen direkt Ellipse2D und werden nirgendwo anders verwendet; Außerdem verbessert die Tatsache, dass sie verschachtelt sind, die Lesbarkeit in Code, der sie verwendet. Wenn eine innere Klasse sehr nützlich ist, wenn sie allgemeiner ist, ist es oft besser, sie zu verallgemeinern und eine reguläre Klasse zu bilden.

Außerdem können innere Klassen direkt auf Variablen in der äußeren Klasse zugreifen . Das bedeutet, dass eine innere Klasse verwendet werden kann, um die äußere Klasse zu ändern. Es ist immer noch möglich, eine Instanz davon außerhalb jeder Klasse zu verwenden. Um zu veranschaulichen, was ich sage:

%Vor%

Eine weitere mögliche Verwendung von inneren Klassen besteht darin, etwas wie eine Wrapper-Klasse für eine wirklich gewünschte innere Klasse zu erstellen, besonders nützlich für eine rekursive Klasse. Dies wird zur Implementierung eines LinkedList verwendet. Zu einer Zeit habe ich eine solche Liste implementiert, ohne zu merken, dass etwas Ähnliches vorher gemacht wurde. Die Idee ist, dass Sie Ihre Klasse LinkedList und eine Node -Klasse darin haben (wobei jeder Knoten nur auf den nächsten / vorherigen Knoten zeigt und einen einzelnen Wert enthält). Auf diese Weise wird der Code vereinfacht. Es macht jedoch keinen Sinn, dass die Node -Klasse außerhalb von LinkedList steht, denn welcher Typ von "Knoten" wäre das? Daher sollte es eine interne Klasse sein.

    
Justin 26.11.2013, 05:40
quelle
1

Manche Klassen machen alleine keinen Sinn - sie machen nur Sinn im Kontext einer anderen Klasse. Innere Klassen sind hilfreich bei Definition dieser Art von Beziehung - sie ermöglichen es dem Entwickler drückt die Beziehung zwischen stark zusammenhaltenden Klassen ausdrücklicher aus.

mehr

Betrachten Sie als Beispiel einen Knoten in einem Diagramm. Ein Knoten hat eine Peer-Liste Knoten, die es selbst erreichen kann. Es ist sinnvoll, eine Peer-Klasse zu definieren als eine innere Klasse von Knoten. Zum Beispiel:

%Vor%     
Rakesh KR 26.11.2013 04:04
quelle
1

Es gibt zwei Vorteile, die ich sehe. Ich habe sie selbst nicht zu oft benutzt, daher sind es nur meine Beobachtungen.

  1. Wenn die innere Klasse sehr klein ist, könnte es einfacher sein, sie als innerlich zu definieren, anstatt eine separate Datei dafür zu erstellen. Es würde bei der Verwaltung in großen Projekten helfen, die bereits zu viele Dateien haben.

  2. Zweitens, wenn die innere Klasse nur im Kontext der Elternklasse verwendet werden kann, würde die Definition als innere Klasse dem Namespace mit der Elternklasse dienen.

    %Vor%

Von der Antwort Inner Class. Was ist der Zweck?

  

Was bringt uns das? Nun, die innere Klasseninstanz hat Zugriff   zu den Instanzmembern der enthaltenden Klasseninstanz. Diese   umschließende Instanzmitglieder werden innerhalb der inneren Klasse via bezeichnet   nur ihre einfachen Namen, nicht über dies (dies in der inneren Klasse   bezieht sich auf die innere Klasseninstanz, nicht auf das zugehörige containing   Klasseninstanz)

Siehe auch Was sind die inneren Klassen in Java? Sind geschachtelte Klassen und innere Klassen identisch?

    
RandomQuestion 26.11.2013 04:11
quelle
1

Zweck der inneren Klasse

Innere Klassen stellen einen speziellen Beziehungstyp dar, der auf alle Member (Datenelemente und Methoden) der äußeren Klasse einschließlich der privaten zugreift. Geschachtelte Klassen können zu besser lesbarem und wartbarem Code führen, da sie Klassen nur an einer Stelle gruppieren.

    
user3034865 26.11.2013 04:33
quelle
0

Ein Beispiel, wenn innere Klassen notwendig sind

Angenommen, Sie haben eine Java-GUI-Klasse (Graphical User Interface), die als Chat-Client wie Gchat oder Facebook Chat fungiert. Denken Sie darüber nach, welche Methoden in einer Klasse wie der eines Chat-Clients vorhanden sein müssen - Sie benötigen eine Methode, die Benutzereingaben aus der Chat-Box liest, Methoden, um die Benutzereingaben an den Server und an den Benutzer zu senden Chatten mit, auch eine Methode, die erkennt, dass Sie tippen, so dass Gchat den Text "XZY wird eingeben" an Ihre Freunde anzeigen kann, etc.

In unserem Beispiel werden zwei Arten von Methoden benötigt

Es sollte also klar sein, dass es zwei verschiedene Arten von Methoden geben muss, die Ihre Chat-Client-Anwendung antreiben: 1. Chatten Sie kundenspezifische Methoden wie diejenigen, die Benutzereingaben aus der Chat-Box lesen und Benutzereingaben senden der Server. 2. Ereignisbehandlungsmethoden, die auf tatsächliche Ereignisse reagieren, die im Chat-Client-Fenster auftreten - wie das Drücken der "RETURN" -Taste, das Erkennen von konsistentem Tippen usw.

Da es klar ist, dass es zwei verschiedene Arten von Methoden geben muss, dann scheint es aus objektorientierter Sicht, dass wir zwei verschiedene Klassen haben sollten: eine Klasse für die spezifischen Methoden des Chat-Clients und eine Klasse für das Ereignis Handhabungsmethoden. Das folgt den normalen objektorientierten Entwurfspraktiken - weil wir Klassen erstellen, die auf das, was sie tun, spezialisiert sind.

Das Problem mit zwei separaten Klassen

Aber in diesem speziellen Beispiel gibt es ein Problem mit zwei separaten Klassen. Und dieses Problem ist die Tatsache, dass der Code für die Ereignisbehandlung sehr eng mit dem Code des Chat-Clients verbunden ist. Das macht Sinn, wie wir schon früher mit unserem GChat-Beispiel gesprochen haben; Sobald ein Benutzer in GChat auf der Tastatur "RETURN" oder "ENTER" drückt, sollte ein Ereignis ausgelöst werden, das dann den Text aus dem Chat-Client-Fenster holen soll. Und das Chat-Client-Fenster wäre eine bestimmte Instanz (im Grunde ein Objekt) der Chat-Client-Klasse. Wenn Sie beispielsweise in GChat mit Ihrem Freund Bob sprechen, hat er in Google Mail ein Fenster und in Google Mail wird ein Fenster geöffnet. Jedes Fenster ist ein Objekt der Chat-Client-Klasse. Daher gibt es zwei separate Objekte der Chat-Client-Klasse - eine für Sie und eine für Bob.

Wenn Bob jetzt etwas eintippt und die RETURN-Taste drückt, muss der Event-Handler-Code, der auf die RETURN-Taste reagiert, mit Bobs Chat-Client-Klassenobjekt kommunizieren können, damit er den Text aus Bobs Chat holen kann Clientklassenfenster oder das Textfeld, in dem der Text tatsächlich gespeichert ist. Der Schlüssel hier ist das Denken in Bezug auf Objekte - ein Objekt der Chat-Client-Klasse wird für jede Person erstellt, die GChat verwendet, so dass Sie Ihr eigenes Objekt haben und Bob sein eigenes Objekt haben wird. Dies bedeutet, dass der Ereignisbehandlungscode auf das Textfeld eines Chat-Client-Objekts zugreifen muss, das ein Mitglied der Klasse und eine Instanzvariable ist. Es sollte also klar sein, dass der Ereignisbehandlungscode Zugriff auf die Mitglieder eines Chat-Client-Klassenobjekts benötigt, um effektiv helfen zu können.

Warum kombinieren wir nicht einfach den Ereignisbehandlungscode mit dem Chat-Client-Code?

Das Kombinieren der Event-Handling-Methoden mit den Chat-Client-spezifischen Methoden in einer großen Klasse klingt zunächst nach einer guten Idee, aber es gibt ein großes Problem: Wenn sowohl der Event-Handling-Code als auch der Chat-Client-Code etwas Code erben muss Dann sind Sie in Schwierigkeiten, da Java keine Mehrfachvererbung unterstützt. Das bedeutet, dass unsere eine "große Klasse" nicht von zwei verschiedenen Klassen erben kann.

Innere Klassen zur Rettung

Aus diesem Grund wurden innere Klassen geschaffen - für genau die Situationen, die wir oben beschrieben haben. Eine Instanz einer inneren Klasse kann auf Mitglieder einer Instanz der äußeren Klasse zugreifen, da eine innere Klasse nur ein anderes Mitglied der äußeren Klasse ist. Und innere Klassen können sogar auf die privaten Mitglieder der äußeren Klasse zugreifen - ja, Sie haben das richtig gelesen!

Lesen Sie dies - Wann sollten innere Klassen sein in Java verwendet?

    
Raw Coder 01.07.2015 12:52
quelle
0

Statische innere Klasse erreicht private statische Felder von äußeren Klassen. Es bedeutet, dass, wenn ich die Outer.Inner-Klasse irgendwo ausdehne (weil Inneres statisch ist, muss ich kein Objekt vor dem Erweitern erzeugen), kann ich die privaten Felder der Äußeren Klasse nicht erreichen. Dies ist perfekt für die Kontext-Sicherheit.

    
Erdal76t 12.01.2016 08:26
quelle
0

1) Geschachtelte Klassen stellen einen speziellen Beziehungstyp dar, der auf alle Member (Datenelemente und Methoden) der äußeren Klasse einschließlich private zugreifen kann.

2) Geschachtelte Klassen werden verwendet, um besser lesbaren und wartbaren Code zu entwickeln, da sie Klassen und Schnittstellen nur an einer Stelle logisch gruppieren.

3) Code-Optimierung: Es erfordert weniger Code zum Schreiben.

    
Suganya Shanker 17.01.2017 06:50
quelle

Tags und Links