2016-04-13 15 views
2

Ich versuche, eine Situation zu denken, wo ich könnte einen nicht statischen inneren Typen (Klasse) innerhalb einer anderen Klasse (anders als die Situation weiter unten diskutiert) zu erklären, können Sie den folgenden CodeJava verschachtelte Typen Szenarien

betrachten
public class OuterClass { 

    public int OuterMember; 

    public static class StaticInner{ 
     public int x; 
    } 

    public class NonStaticInner{ 
     public int x; 
     public int y = OuterMember; // none static nested type can access parent members 
    } 

    public NonStaticInner getNonStaticInner(){ 
     return new NonStaticInner(); 
    } 
} 

public class TestClass { 
    public OuterClass.StaticInner staticObject = new OuterClass.StaticInner(); 
    public OuterClass outer = new OuterClass(); 
    public OuterClass.NonStaticInner nonStaticObject = outer.getNonStaticInner(); 

    public TestClass() 
    { 
     nonStaticObject.y = 5; 
     nonStaticObject.x = 7; 
     staticObject.x = 2; 
    } 
} 

jetzt ist meine Frage: wenn ich keine Schließung innerhalb nonStaticObject brauchte oder mit anderen Worten, wenn ich nicht auf "OuterMember" von innerhalb von NonStaticInner zugreifen musste, gibt es irgendeinen Wert, NonStaticInner als nicht statisch zu erklären? Schließlich kann ich beliebig viele Instanzen von NonStaticInner oder StaticInner erstellen, außer dass ich für StaticInner keine Instanz von "OuterClass" benötige.

+0

Sie sollten im Allgemeinen statische vorziehen, wenn die innere Klasse nicht an eine bestimmte Instanz der äußeren Klasse gebunden ist. – shmosel

+0

In Java gibt es keine solche "statische innere Klasse", da eine innere Klasse in Java definitionsgemäß eine nicht-statische geschachtelte Klasse ist. –

+0

@LewBloch Ich wollte sagen (oder tat tatsächlich) statisch innerer Typ –

Antwort

2

Der Grund für die Erstellung eines inneren (dh nicht statisch verschachtelten) Klasse in Java ist es mit der enthaltenden Instanz verknüpft, um auf die Mitglieder der äußeren Instanz zuzugreifen. Zum Beispiel werden Ereignishandler in AWT/Swing allgemein als innere Klasseninstanzen deklariert, die ihnen Zugriff auf die Instanzmitglieder von beispielsweise JPanel geben, deren Ereignisse sie behandeln. Vor lambdas wurden innere Klassen häufig als Funktortypen verwendet, und heute übersetzen lambdas oft in innere Klassen.

Es ist ziemlich klar, dass, wenn eine Klasse Zugriff auf die Mitglieder des enthaltenden Typs benötigt, dass es eine innere Klasse sein sollte. Es ist weniger klar, wenn Sie eine statische geschachtelte Klasse als eine geschachtelte Klasse deklarieren. Schließlich funktioniert es wie eine Top-Level-Klasse (entweder 'public' oder Standardzugriff). Warum also nicht zu einer erstklassigen Klasse? Die Antwort besteht darin, dass Sie den verschachtelten Typ als zu eng an die Funktionalität des umschließenden Typs gebunden ansehen, um einen Aufstieg auf die oberste Ebene zu rechtfertigen. In der Regel bedeutet dies, dass der Containertyp den verschachtelten Typ benötigt, aber niemand sonst oder wird.

+0

Danke, nur um sicherzustellen, dass ich verstehe, was du gesagt hast, sagst du, dass das Deklarieren eines statischen verschachtelten Typs etwas gegensätzlich ist, da es immer noch als ein äußerer Typ behandelt werden kann (oder tatsächlich ist). coz, auch wenn "niemand sonst den verschachtelten Typ braucht oder jemals braucht", kann immer noch auf ihn zugegriffen werden und als ein äußerer Typ behandelt werden –

+0

'Map.Entry' ist vielleicht das kanonischste Beispiel eines statisch verschachtelten Typs. Es ist nur als Mittel der Assoziation verschachtelt. – Radiodef

+0

Ich sage nicht, dass statische verschachtelte Typen nicht intuitiv sind. Ich sage, dass es weniger klar ist, wann man einen verwenden sollte als bei inneren Klassen. Es ist auch nicht wahr, dass ein statisch geschachtelter Typ "eigentlich ... ein äußerer Typ" ist. Es ist tatsächlich nicht. Sie können es auch nicht als eins behandeln oder als eins darauf zugreifen. –