2012-02-10 15 views
8

Come consentire inizializzatore statico su una classe interna come questo:Inizializzatore statico su una classe interna?

public class MyClass { 

    public class InnerClass { 
     static { 
      // do something 
     } 
     public bar(){ 
      // do something 
     } 
    } 

    // method stuff 
    public void foo() { 
     // do something 
    } 

} 

risposta

10

Da JLS 8.1.3 Inner Classes and Enclosing Instances:

classi interne non possono dichiarare inizializzatori statici (§8.7) o interfacce membri.

Che cosa si può desiderare è una classe annidata :

public static class InnerClass { // note "static" 
+1

Nella mia esperienza, in circa l'80% delle volte, una classe nidificata è ciò che le persone volevano definire comunque. In questo caso il numero minimo di parole chiave sta danneggiando Java; come designer del linguaggio potresti voler rendere le classi nidificate come predefinite e avere una parola chiave "interiore" per le classi interne. –

4

È necessario definire la classe InnerClass come statica. Ma, da quel momento in poi, non sarà una normale classe interiore.

+0

Questo è ok nel mio caso poiché la mia classe "interiore" non accederà ai metodi di classe che li includono. In realtà, avrei potuto creare un file di classe .java separato, tuttavia, poiché la classe sarà accessibile solo sulla classe che li include, quindi ho deciso di includere solo la classe. – xybrek

1

Come già affermato da @yshavit non è possibile dichiarare inizializzatori statici, ma da quello che ho trovato è possibile aggirare il problema dichiarando un metodo per eseguire le inizializzazioni desiderate e chiamarlo semplicemente quando si definiscono i campi della classe. Per esempio ho implementato questo iteratore (questa è una classe interna anonima):

public Iterator<String> iterator() { 

    return new Iterator<String>() { 

     int someField = initializeIterator(); 

     // Keeps current position in the list of direct neighboring out 

     private int initializeIterator() { 
      // Do your initializations 
     } 

     @Override 
     public boolean hasNext() { 
      //hasNext implementation 
     } 

     @Override 
     public Vertex next() { 
      //next implementation 
     } 
     //... 

questo si sente molto hack-y e mi chiedo se mi manca qualcosa, ma questo funziona del tutto e il metodo di inizializzazione viene chiamato solo una volta solo come un blocco di inizializzazione statico sarebbe ...

Problemi correlati