2012-02-10 34 views
8

Cómo permitir el inicializador estático en una clase interna como esto:Inicializador estático en una clase interna?

public class MyClass { 

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

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

} 

Respuesta

10

De JLS 8.1.3 Inner Classes and Enclosing Instances:

Las clases internas no pueden declarar inicializadores estáticos (§8.7) o interfaces de miembros.

Lo que se puede desear es una clase anidada :

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

En mi experiencia, en aproximadamente el 80% de las veces, una clase anidada es lo que la gente quería definir de todos modos. En este caso, el número mínimo de palabras clave está perjudicando a Java; como diseñador de idiomas, es posible que desee hacer que las clases anidadas sean las predeterminadas y tener una palabra clave "interna" para las clases internas. –

4

Es necesario definir la clase InnerClass como estática. Pero, a partir de entonces, no será una clase interna regular.

+0

Esto está bien en mi caso ya que mi clase "interna" no va a acceder en absoluto a los métodos de clases adjuntas. De hecho, podría haber creado un archivo de clase .java separado, sin embargo, dado que solo se accederá a la clase en dicha clase adjunta, entonces decidí adjuntar la clase. – xybrek

1

Como ya lo indicó @yshavit no se pueden declarar los inicializadores estáticos, pero por lo que encontré, puedes evitarlo declarando un método para hacer las inicializaciones que quieras y simplemente llamarlo para definir los campos de tu clase. Por ejemplo he implementado este iterador (esto es una clase interna anónima):

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 
     } 
     //... 

Esto se siente muy Hack-Y y me pregunto si me falta algo, pero esto funciona totalmente y el método de inicialización sólo se le llama una vez sólo como un bloque de inicialización estático sería ...