2013-04-22 5 views
19

Ich habe eine innere Klasse in meiner Java-Klasse.Was ist der Vorteil einer inneren Klasse als statisch mit Java zu machen?

enter image description here

Als ich find bugs laufen, es empfiehlt (warnt) als statisch zu machen.

enter image description here

Was ist der Sinn dieser Warnung? Was ist der Vorteil einer inneren Klasse als statisch?

+0

möglich Duplikat [Java inneren Klasse und statischer verschachtelter Klasse] (http://stackoverflow.com/questions/70324/java-inner- finden class-and-static-nested-class) – andyb

+0

Die verknüpfte Frage ist * nicht * ein Duplikat - sie weist nicht auf Vor- oder Nachteile hin, eine innere Klasse statisch zu machen. – Perception

+0

mögliche Duplikate von [Statisch verschachtelte Klasse in Java, warum?] (Http://stackoverflow.com/questions/253492/static-nested-class-in-java-why) – fglez

Antwort

19

Wenn die geschachtelte Klasse nicht auf eine der Variablen der einschließenden Klasse zugreift, kann sie statisch gemacht werden. Der Vorteil besteht darin, dass Sie keine umschließende Instanz der äußeren Klasse benötigen, um die geschachtelte Klasse zu verwenden.

+0

+1 Ich bin gerade in dieses Problem geraten, ein Manatrank in meiner Zaubertrank-Klasse, aber vergessen, sie als statisch zu deklarieren, machte es unmöglich, neue ManaPotion() zu deklarieren. – arynaq

+1

@arynaq - Die Vererbung ist ein starker Hinweis darauf, dass 'ManaPotion' * keine * innere Klasse von' Potion' sein sollte. Ein gutes positives Beispiel ist 'Map', das' Map.Entry'-Instanzen verwendet, um seine Einträge zu halten. Wird 'Potion'' Potion.ManaPotion' verwenden? Dies gilt auch für statische innere Klassen. –

+0

Richtig, es war das Testen, das ist das einzige Mal, dass ich verschachtelte Klassen verwende. – arynaq

2

Eine nicht statische innere Klasse hat einen impliziten Verweis auf die äußere Klasse. Wenn Sie die Klasse als statisch definieren, können Sie Speicher und Code speichern.

7

Eine innere Klasse hat standardmäßig einen impliziten Verweis auf ein Objekt der äußeren Klasse. Wenn Sie ein Objekt davon aus dem Code der äußeren Klasse instanziieren, geschieht dies alles für Sie. Andernfalls müssen Sie das Objekt selbst bereitstellen.

Eine statische innere Klasse hat dies nicht.

Das bedeutet, dass es außerhalb des Bereichs eines äußeren Klassenobjekts instanziiert werden kann. Dies bedeutet auch, dass beim Exportieren einer Instanz der inneren Klasse das aktuelle Objekt nicht erfasst wird.

Wenn die innere Klasse keinen Grund hat, auf die äußere Klasse zuzugreifen, sollten Sie sie standardmäßig als Standard festlegen.

+0

Ich liebe die Grundregel, die Sie definiert haben. – roottraveller

2

Eine statische innere Klasse ist eine semantisch einfachere Sache. Es ist wie eine Top-Level-Klasse, außer Sie haben mehr Optionen für die Sichtbarkeit (z. B. können Sie es privat machen).

Ein wichtiger Grund zur Vermeidung von nicht statischen inneren Klassen ist, dass sie komplexer sind. Es gibt den versteckten Verweis auf die äußere Klasse (vielleicht sogar mehr als eine). Und ein einfacher Name in einer Methode der inneren Klasse kann nun eines von drei Dingen sein: ein lokaler, ein Feld oder ein Feld einer äußeren Klasse.

Ein Artefakt dieser Komplexität ist, dass der versteckte Verweis auf die äußere Klasse zu Speicherlecks führen kann. Nehmen wir an, die innere Klasse ist ein Listener und könnte eine statische innere Klasse sein. Solange der Listener registriert ist, enthält er einen Verweis auf die Instanz der äußeren Klasse, die wiederum große Speichermengen festhalten kann. Wenn der Listener statisch gemacht wird, kann die äußere Instanz möglicherweise als Garbage Collection erfasst werden.

0

Wir haben bereits gute Antworten, hier sind meine 5 Cent:

sowohl statische als auch nicht-statische innere Klassen verwendet werden, wenn wir logische Funktionalitäten noch die Methoden und Variablen der äußeren Klasse trennen müssen verwenden. Beide inneren Klassen haben Zugriff auf die privaten Variablen der äußeren Klasse.

Vorteile der statischen inneren Klasse: 1) statische Klassen die statischen Variablen aus äußeren Klasse zugreifen können 2) statische Klassen wie eine unabhängige Klasse behandelt werden

nicht-statische innere Klasse: use 1) nicht

0123: static Mitglieder der äußeren Klasse 2) kann nicht wie eine unabhängige Klasse

public class NestedClassDemo { 
    private int a = 100; 
    int b = 200; 
    private static int c = 500; 

    public NestedClassDemo() { 
     TestInnerStatic teststat = new TestInnerStatic(); 
     System.out.println("const of NestedClassDemo, a is:"+a+", b is:"+b+".."+teststat.teststat_a); 
    } 

    public String getTask1(){ 
     return new TestInnerClass().getTask1(); 
    } 

    public String getTask2(){ 
     return getTask1(); 
    } 


    class TestInnerClass{ 
     int test_a = 10; 

     TestInnerClass() { 
      System.out.println("const of testinner private member of outerlcass"+a+"..."+c); 
     } 
     String getTask1(){ 
      return "task1 from inner:"+test_a+","+a; 
     } 
    } 

    static class TestInnerStatic{ 
     int teststat_a = 20; 

     public TestInnerStatic() { 
      System.out.println("const of testinnerstat:"+teststat_a+" member of outer:"+c); 
     } 

     String getTask1stat(){ 
      return "task1 from inner stat:"+teststat_a+","+c; 
     } 
    } 

    public static void main(String[] args){ 
     TestInnerStatic teststat = new TestInnerStatic(); 
     System.out.println(teststat.teststat_a); 
     NestedClassDemo nestdemo = new NestedClassDemo(); 
     System.out.println(nestdemo.getTask1()+"...."+nestdemo.getTask2()); 
    } 
} 

Zugriff auf die statische innere und nicht-statische innere Klasse von außen behandelt werden

public class TestClass { 
    public static void main(String[] args){ 
     NestedClassDemo.TestInnerClass a = new NestedClassDemo().new TestInnerClass(); 
     NestedClassDemo.TestInnerStatic b = new NestedClassDemo.TestInnerStatic(); 
    } 
} 

Der offizielle Java-doc für statische innere Klasse kann bei https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

Verwandte Themen