2013-08-30 7 views
5
public class Application { 
    public static void main(String[] args) { 
     final class Constants { 
      public static String name = "globe"; 
     } 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println(Constants.name); 
      } 
     }); 
     thread.start(); 
    } 
} 

Compilation Fehler deklariert werden?Fehler: <code>The field name cannot be declared static in a non-static inner type, unless initialized with a constant expression</code></p> <p>Lösung dieses Problems: Feldname kann nicht statisch

+0

Haben Sie versucht, 'Konstanten' zu einem statischen Typ zu machen? –

+0

Nicht deklarieren Sie den String in Konstanten oder machen Sie letzte Klasse Konstanten auch statisch (und wahrscheinlich nicht innerhalb der Hauptmethode deklarieren). – Matthias

Antwort

8

Mit Java lassen sich nicht-endliche statische Felder innerhalb von funktionslokalen inneren Klassen nicht definieren. Nur Klassen der obersten Ebene und statische geschachtelte Klassen dürfen nicht endgültige statische Felder enthalten.

Wenn Sie ein static Feld in Ihrer Constants Klasse wollen, setzen Sie es auf der Application Klasse-Niveau, wie folgt aus:

public class Application { 
    static final class Constants { 
     public static String name = "globe"; 
    } 
    public static void main(String[] args) { 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println(Constants.name); 
      } 
     }); 
     thread.start(); 
    } 
} 
+2

Ihr erster Satz ist falsch - wenn das Feld innerhalb des ursprünglichen Codes "final" gemacht wird, wird es kompiliert, da es mit einem konstanten Wert initialisiert wird. –

+0

Jetzt sollte die Variable 'name' deklariert werden' final' –

+1

@ micro.pravi: Wenn Sie es 'final' machen, können Sie' Constants' wieder zu einer lokalen Klasse machen .. –

6

Vom JLS section 8.1.3:

Inner classes may not declare static members, unless they are constant variables (§4.12.4), or a compile-time error occurs.

Sie sind also in Ordnung, wenn Sie machen nur die Variable final:

public class Application { 
    public static void main(String[] args) { 
     final class Constants { 
      public static final String name = "globe"; 
     } 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println(Constants.name); 
      } 
     }); 
     thread.start(); 
    } 
} 

Natürlich funktioniert das nicht, wenn Sie es mit einem nicht konstanten Wert initialisieren müssen.

Nachdem all dies gesagt wurde, ist es ein ungewöhnliches Design, IMO. Es ist sehr selten, eine benannte lokale Klasse überhaupt zu sehen, meiner Erfahrung nach. Haben Sie müssen dies eine lokale Klasse sein? Was versuchst du zu erreichen?