2008-11-21 25 views
13

Estoy usando Apache Commons EqualsBuilder para construir el método equals para una clase interna Java no estática. Por ejemplo:¿Cómo hacer referencia a la clase externa en otra instancia de una clase interna no estática?

import org.apache.commons.lang.builder.EqualsBuilder; 

public class Foo { 
    public class Bar { 
     private Bar() {} 

     public Foo getMyFoo() { 
      return Foo.this 
     } 

     private int myInt = 0; 

     public boolean equals(Object o) { 
      if (o == null || o.getClass() != getClass) return false; 

      Bar other = (Bar) o; 
      return new EqualsBuilder() 
       .append(getMyFoo(), other.getMyFoo()) 
       .append(myInt, other.myInt) 
       .isEquals(); 
     } 
    } 

    public Bar createBar(...) { 
     //sensible implementation 
    } 

    public Bar createOtherBar(...) { 
     //another implementation 
    } 

    public boolean equals(Object o) { 
     //sensible equals implementation 
    } 
} 

¿Existe la sintaxis mediante el cual puedo referir a other 's Foo referencia, aparte de declarar el método getMyFoo()? Algo como other.Foo.this (que no funciona)?

Respuesta

5

La mejor manera es probablemente lo que usted sugiere: añadir un método getFoo() a su clase interna.

2

No, no es posible sin un getter. La palabra clave 'this' siempre apuntará a la instancia actual. Tengo curiosidad por saber por qué querrías hacer esto ... parece que estás haciendo composición de la manera incorrecta.

public class Foo { 

    public Bar createBar(){ 
    Bar bar = new Bar(this) 
    return bar; 
    } 
} 

public class Bar { 
    Foo foo; 
    public Bar(Foo foo){ 
    this.foo = foo; 
    } 

    public boolean equals(Object other) { 
    return foo.equals(other.foo); 
    } 
} 

Dado que el uso Foo.this limita la creación de la clase interna (Foo myFoo = new Foo(); myFoo.new Bar (.), A una instancia que diría esto es mucho más limpio

+0

Supongamos que el constructor de Bar es privado y casos son creados por métodos de fábrica definidos en Foo; también, cada instancia de barra debe estar sujeta a una instancia de Foo es posible hacer esto con las clases internas estáticas,. pero el objetivo de la función de idioma es simplificar dicho uso. –

+0

Ah, y ambas clases es necesario poder referirse a los miembros privados de los demás. –

+0

En mi caso particular, Bar es abstracto y los métodos de fábrica devuelven objetos de clases anónimas que se extienden a Bar, que implementan un método público definido como abstracto en Bar; las implementaciones se cierran sobre el alcance de los argumentos pasados ​​a los métodos de fábrica respectivos. –

-1

Sí:

public class Foo { 
    public class Bar { 
     public Foo getMyFoo() { 
      return Foo.this; 
     } 
    } 
    public Foo foo(Bar bar) { 
     return bar.getMyFoo(); 
    } 
    public static void main(String[] arguments) { 
     Foo foo1=new Foo(); 
     Bar bar1=foo1.new Bar(); 
     Foo foo=(new Foo()).foo(bar1); 
     System.out.println(foo==foo1); 
    } 
} 
+0

Esto no responde la pregunta. De hecho, es más o menos lo que estaba tratando de evitar. –

Cuestiones relacionadas