2015-09-22 15 views
6

Warum erlaubt Java keine statischen Deklarationen mit einem statischen Initialisierungsblock in einer nicht statischen inneren Klasse?Warum können Sie einen Initialisierungsblock für eine statische Variable in einer inneren Klasse nicht verwenden?

im folgenden Code wird Outer2 funktionieren und Inner2 wird nicht, trotz der gleichen Sache. irgendwelche Ideen? Ich bin nicht auf der Suche nach einem Workaround, ich versuche nur zu verstehen, warum Java dies nicht tut.

public class WhyUNoStatic { 
    public static final String outer1 = "snth"; // ok 
    public static final String outer2; // ok 
    static 
    { 
     outer2 = "snth"; 
    } 

    public class Inner { 
     public static final String inner1 = "snth"; // still ok! 
     public static final String inner2; // FAILURE TIME 
     static 
     { 
      inner2 = "snth"; 
     } 
    } 
} 

edit: beachten Sie, dass inner1 gut funktionieren wird. Es ist nicht so, dass Java statische Vars in inneren Klassen verbietet, es verbietet nur deren Deklarationen.

+2

Da innere Klassen nicht 'static' nicht final Mitglieder haben kann, und' static {} 'ist ein statisches Element. Könnte sein? –

+0

Java verbietet nicht konstante Variablen in inneren Klassen. 'inner1 'ist eine konstante Variable. 'inner2' ist nicht. –

Antwort

2

Die JLS, Section 8.1.3, verbietet dieses Verhalten.

Es ist ein Fehler bei der Kompilierung, wenn eine innere Klasse einen statischen Initialisierer deklariert (§8.7).

Es ist ein Kompilierungsfehler, wenn eine innere Klasse ein Member deklariert, das explizit oder implizit statisch ist, es sei denn, das Member ist eine konstante Variable (§4.12.4).

Sie erklärte Ihre static Variablen final in Ihrer inneren Klasse, die in Ordnung ist, aber der statische Initialisierer ist verboten.

+0

Und aus dem Grund, warum, hätte es wahrscheinlich die ohnehin recht komplizierte Initialisierungssequenz noch komplizierter gemacht. – biziclop

+0

Ja, das ist, was ich versuche zu bekommen. Warum kann der Compiler das nicht handhaben? Ich würde gerne ein Codebeispiel sehen, um zu zeigen, warum es für den Compiler schwierig ist, damit umzugehen ... – acushner

2

Siehe JLS Chapter 8

Innere Klassen nicht statisch initializers erklären können (§8.7) oder Mitglied Schnittstellen oder ein Fehler bei der Kompilierung auftritt.

Sie können eine verschachtelte Klasse deklarieren statt

public static class Inner {...} 
Verwandte Themen