2009-02-11 27 views
5

Para acceder al campo x de una clase exterior A partir de una clase interna B, que se dan cuenta de que se puede utilizar "A.this.x". Pero, ¿y si la clase externa también es anónima? Por ejemplo,Acceso campo de una clase anónima exterior de una clase anónima interna

public class Main1 { 
    public static void main(String[] args) { 
     Comparable c1 = new Comparable(){ 
      int x = 3; 
      public int compareTo(Object o) { 
       Comparable c2 = new Comparable(){ 
        int x = 4; 
        public int compareTo(Object o) { 
         return x; // <-- THIS LINE 
        } 
       }; 
       return c2.compareTo(o); 
      } 
     }; 
     System.out.println(c1.compareTo(null)); 
    } 
} 

Cuando se ejecuta este código, el valor de 4 se imprime, ya que es el valor del campo de c2 x. Sin embargo, me gustaría cambiar la línea marcada "THIS LINE" para que devuelva la x de la clase externa (es decir, el campo x de c1, con el valor 3). Si la clase externa (es decir, la clase de c1) eran una clase Un llamado, entonces podría reemplazar

return x; 

con

return A.this.x; 

Pero desde la clase externa también es anónima, no tengo un nombre para usar

Pregunta: ¿Hay alguna manera de modificar la línea etiquetada "THIS LINE" para que se refiera al campo x de c1 en lugar de c2, sin cambiar las clases anónimas en clases con nombre?

Me doy cuenta de que este código es realmente feo y no es un buen estilo de programación utilizar clases anónimas de esta manera, pero el código está siendo generado por otro programa, y ​​esta es la forma más fácil de implementar el generador.

Respuesta

4

Evitaría ocultar la otra variable eligiendo un nombre que no sea x.

0

creo que tendrá que declarar los campos final - el código que tiene allí compila solamente debido a la sombra que se está quejando . No es verdad.

Esto parece un caso clásico en algo así como Lisp de gensym hará las cosas más fáciles. En otras palabras, haga que el generador de códigos use identificadores diferentes para esas variables, p. x1 y x2.

+0

Los campos no necesitan ser definitivos; eso es solo para parámetros/variables locales. Si llamaba al campo exterior 'y', podía acceder a él desde la clase más interna. –

2

La respuesta simple es que la sombra no las variables:

public static void main(String[] args) { 
    Comparable c1 = new Comparable() { 
     int x = 3; 
     public int compareTo(Object o) { 
      Comparable c2 = new Comparable() { 
       //changed this name 
       int y = 4; 
       public int compareTo(Object o) { 
        return x; 
       } 
      }; 
      return c2.compareTo(o); 
     } 
    }; 
    System.out.println(c1.compareTo(null)); 
} 

Salida:

Teniendo en cuenta que se está trabajando con el código generado, es esta una opción para ¿tú?

1

AFAIK no hay forma de lograr lo que desea. Si puede cambiar el código (como parece que puede) pero no desea cambiarlos a clases con nombre, ¿puede simplemente cambiar el nombre de las variables para que no tenga problemas de alcance? Deberías cambiarles el nombre para mayor claridad

1

Las clases son anónimas, sin nombre. No hay forma de acceder a sus campos utilizando la referencia del nombre. No hay nombre

Cuestiones relacionadas