2013-04-18 6 views
12

In Java können Sie innere Klassen haben. Ich bin aus einer Designperspektive neugierig, wenn es irgendwelche Vorteile gibt.Java Inner Classes Design Benifits

Meine ersten Gedanken sind, dass eine separate Datei mit der Klasse sauberer in Dinge in wiederverwendbare Module zu trennen ist. Wenn andere Klassen diese andere Klasse verwenden möchten, können sie auch eigene Instanzen erstellen. Für mich scheint es, als wäre die Vermeidung der inneren Klassen ein besseres Design für Erweiterbarkeit und Wiederverwendung von Code, und wenn man an neuen Projekten arbeitet, ist es normalerweise schwer zu sagen, ob die Klasse wiederverwendet wird oder nicht ... getrennte Klassen ist der Weg zu gehen.

Ich stelle diese Frage, weil ich ein Projekt übernommen habe, das eine Reihe von diesen ... hat, die mich denken lassen, dass der vorherige Entwickler von der IDE gerade faul oder nicht vertraut war. Aber ich möchte sicherstellen, dass ich keine Vorteile verpasse, die diese inneren Klassen haben. Wenn es Vorteile gibt, kann mir jemand Bescheid geben, und dann kann ich bestätigen, ob der vorherige Entwickler diese Vorteile genutzt hat.

+2

Meinst du wirklich innere Klassen oder [statische] verschachtelte Klassen? –

+1

Zum einen hat die innere Klasse Zugriff auf Mitglieder der äußeren Klasse, manchmal kann sie bei der Einkapselung von Objekten/Klassen helfen (Vermeidung unnötiger Getter und Setter). – kamituel

+0

Sie machten innere Klassen, aber ich begrüße auch Kommentare über statische verschachtelte Klassen. –

Antwort

12

Innere Klassen sind gut, wenn sie nicht außerhalb der enthaltenen Klasse verwendet werden - es ist eine Möglichkeit, die Klasse aufzublähen. In der Regel verwende ich sie nur einmal.

Nicht statische innere Klassen haben auch Zugriff auf die privaten Felder der enthaltenden Instanz.

+0

Ich mag den Kommentar über Klasse Bloat. Das Problem, auf das ich stieß, war eine Datei, die wie 10 davon aussah, also war die Datei sehr lang und ich fand, dass die Trennung die Dinge leichter für mich zu lesen machte ... –

+0

Gibt es irgendwelche Vorteile oder Nachteile für das Testen ? –

+0

Meine Lesung von "Effective Java" bestätigt Ihre Kommentare. Danke! –

2

Innere Klassen sind nützlich, um:

  1. ausblenden Implementierungsdetails.

  2. Machen Sie die Projektansicht prägnanter und damit verständlich.

  3. Fügen Sie eine logische Gruppierung des zugehörigen Codes hinzu.

1

Eine gute Nutzung von inneren Klassen, die mir in den Sinn kommt, ist in java.util.ArrayList, der seine Iteratoren Implementierungen in private inner classes versteckt. Sie können sie nicht erstellen, außer durch Aufrufen von iterator() oder listIterator() für das Listenobjekt.

Auf diese Weise werden die Iterator und ListIterator Implementierungen für ArrayList mit ihrer verwandten Klasse und Methoden für verbesserte Lesbarkeit gruppiert (die Implementierungen sind ziemlich kurz), aber von anderen versteckt.

Sie können nicht static deklariert werden, da sie Zugriff auf ihre umschließende Instanz Objekt benötigen.

public class ArrayList<E> extends AbstractList<E> 
     implements List<E>, RandomAccess, Cloneable, java.io.Serializable { 
    ... 
    public Iterator<E> iterator() { 
     return new Itr(); 
    } 

    private class Itr implements Iterator<E> { 
    ... 
    } 

    public ListIterator<E> listIterator() { 
     return new ListItr(0); 
    } 

    private class ListItr extends Itr implements ListIterator<E> { 
    ... 
    } 
} 
1

nicht-statische innere Klasse:
1) innere Klasse wird verwendet, um eine bestimmte Aufgabe über die äußere Klasse durchzuführen, und liefert den Ausgang
. So wird sichergestellt, dass das äußere Klassenobjekt erstellt wird, um darauf zuzugreifen.
2) Innere Klasse ist nur spezifisch für die äußere Klasse und keine Verwendung auf der Außenwelt. Sie müssen also nicht über die Wiederverwendung von Code nachdenken.

. Beispiel_1) Das beste Beispiel für innere Klasse ist iterator Implementierung von Sammlung Framework. Set (AbstractCollection.java) und List (AbstractList.java) verwenden unterschiedliche Iterator-Klassenimplementierungen.
-> Wir können den inneren Klassencode wiederverwenden.Zum Beispiel wird die Implementierung von private class Itr innerclass bei java.util.AbstractList sowohl von Arraylist als auch von Vector verwendet.

statische innere Klasse:
1) statische innere Klasse wird nicht auf einer äußeren Klassenobjekt abhängen; aber es ist spezifisch für die äußere Klassenebene. Es wird nicht alleinstehend dargestellt, da es nur für die äußere Klasse spezifisch ist. Also kein Code wiederverwenden.
2) Es Gruppe von Methoden aufweist, die gemeinsam ist (gemeinsam) für alle Objekte (Klasse Ebene) 3)

e.g_1) Sigleton Objekt retrival statische innere Klasse.
Beispiel 2 Builder-Muster
z. B. 3) Komparator-Implementierung für eine Klasse.

0

Innere Klasse ist sehr wichtig, es hilft Ihnen, Kapselung Bedürfnisse sehr ordentlich zu erreichen, kann Ihre Basisklasse auch von vielen Klassen erben (z. B. abstrakte Handler implementieren). Jeder Programmierer kann lernen, wie man die innere Klasse in Java benutzt, das ist sehr nützlich.