2013-08-30 17 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(); 
    } 
} 

Errore di compilazione: The field name cannot be declared static in a non-static inner type, unless initialized with a constant expressionErrore: nome del campo non può essere dichiarato statico

Soluzione a questo?

+0

Hai provato a rendere 'Costanti' un tipo statico? –

+0

Non dichiarare la stringa in Costanti o creare costanti di classe finale anche statiche (e probabilmente non dichiararle all'interno del metodo principale). – Matthias

risposta

8

Java non consente di definire campi statici non finali all'interno delle classi interne della funzione locale. Solo le classi di livello superiore e le classi nidificate statiche possono avere campi statici non definitivi.

Se si desidera un campo static nella classe Constants, metterla a livello Application di classe, come questo:

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

La tua prima frase non è corretta - se il campo è reso 'finale' nel codice originale che compilerà, perché è inizializzato con un valore costante. –

+0

Ora la variabile 'name' deve essere dichiarata' final' –

+1

@ micro.pravi: Se la si rende 'finale', è possibile rendere nuovamente' Constants' una classe locale. –

6

Dal 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.

Quindi stai bene se basta fare la variabile 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(); 
    } 
} 

Ovviamente questo non funzionerà se è necessario inizializzarlo con un valore non costante.

Detto questo, è un design insolito, IMO. È molto raro vedere una classe locale chiamata, secondo la mia esperienza. Hai bisogno di di essere una classe locale? Cosa stai cercando di ottenere?

Problemi correlati