2011-06-30 19 views
7

¿Cómo accedo a un campo de una clase externa, dada una referencia a un objeto de la clase interna?Acceso al campo de la clase externa

class Outer 
{ 
    int field; 

    class Inner 
    { 
     void method(Inner parameter) 
     { 
      // working on the current instance is easy :) 
      field = 0; 
      Outer.this.field = 1; 

      // working on another instance is hard :(
      parameter.field = 2;    // does not compile 
      parameter.Outer.this.field = 3; // does not compile 
      parameter.outer().field = 4;  // This works... 
     } 

     // ...but I really don't want to have to write this method! 
     Outer outer() 
     { 
      return Outer.this; 
     } 
    } 
} 

También probé Outer.parameter.field y muchas otras variantes. ¿Hay una sintaxis que haga lo que quiero?

+0

no es el propósito de una clase interna que ha utilizado justo dentro de su clase externa? – Heisenbug

+0

Creo que esa es la manera de hacerlo. Si siente que está mal, ¿puede pensar en refactorizar o construir esas clases de manera diferente? – Luciano

+5

No conozco otra forma de hacerlo, pero diré que si tienes que hacer contorsiones como esa, generalmente significa que debes reconsiderar el diseño. –

Respuesta

2

Hay dos formas de ver lo que está haciendo, como método estático o como método no estático.

A primera vista, su ejemplo se parece más a un método estático, ya que está manipulando el estado del parámetro en lugar de su propio estado. El problema estático ha sido cubierto anteriormente, p. ver In Java, how do I access the outer class when I'm not in the inner class?

Pero su ejemplo es de un método no estático, y creo que veo lo que está obteniendo y por qué cree que una referencia externa debería ser posible. Después de todo, hay otras situaciones en las que puede acceder a los detalles de implementación de otras instancias de su propio tipo; por ejemplo, es común hacer referencia a los campos de miembros privados del parámetro de entrada al anular equals. Lamentablemente, simplemente no creo que Java proporcione una forma de referirse a la instancia léxicamente envolvente de otra persona. Esto probablemente tiene algo que ver con the way that java actually implements non-static inner classes. Java usa this$0 para sus propios fines, pero no tiene acceso a este campo sintético.

8

Desde fuera de la clase interna, creo que no hay forma, dada una referencia a una instancia de clase interna, de hacer referencia a los miembros de la instancia de clase externa. Desde dentro de una clase interna no estática, puede, por supuesto, hacer referencia a ellos utilizando la sintaxis Outer.this.*.

Piénselo de esta manera: la clase interna es en realidad una clase completamente separada. Tiene un campo generado por el compilador (generalmente llamado algo extraño como this$0). Dentro de la clase interna, el lenguaje le permite hacer referencia a ese campo usando Outer.this; sin embargo, ese azúcar sintáctico no está disponible fuera de la clase interna misma. Tampoco es el campo generado por el compilador.

8

¿Qué hay de esta solución:

class Outer 
{ 
    int field; 

    class Inner 
    { 
     final Outer outer = Outer.this; 
     void method(Inner parameter) 
     { 
      // working on the current instance is easy :) 
      field = 0; 
      Outer.this.field = 1; 

      // working on another instance: 
      parameter.outer.field = 2; 
     } 
    } 
} 
+0

Así es como siempre lo hago, aunque hubiera elegido un no -primitivo campo para su ejemplo. Almacenar solo una referencia al alcance principal y acceder a los campos a través de él evita usar una referencia obsoleta para 'campo' cuando se trata de un Objeto en lugar de una primitiva, que es el beneficio clave de este enfoque. – KomodoDave

Cuestiones relacionadas