2008-11-21 14 views
13

J'utilise Apache Commons EqualsBuilder pour construire la méthode equals pour une classe interne Java non statique. Par exemple:Comment faire référence à la classe externe dans une autre instance d'une classe interne non statique?

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

Y at-il une syntaxe par laquelle je peux me référer à other « s en dehors référence Foo de déclarer la méthode getMyFoo()? Quelque chose comme other.Foo.this (qui ne fonctionne pas)?

Répondre

5

n °

La meilleure façon est probablement ce que vous suggérez: ajouter une méthode getFoo() à votre classe interne.

2

Non, impossible sans getter. Le mot-clé 'this' pointe toujours vers l'instance actuelle. Je suis curieux de savoir pourquoi vous voudriez faire ça ... semble que vous faites de la composition dans le mauvais sens.

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); 
    } 
} 

Depuis l'utilisation Foo.this limite la création de la classe interne (Foo myFoo = new Foo(); myFoo.new Bar(). Un exemple, je dirais que c'est beaucoup plus propre

+0

On suppose que le constructeur de Bar est privé et les instances sont créées par des méthodes définies en usine sur Foo, également, chaque instance de barre doit être liée à une instance de Foo Il est possible de le faire avec les classes internes statiques,. mais le but de la fonction de langage est de simplifier cet usage –

+0

Oh, et les deux classes Il faut pouvoir se référer aux membres privés des autres. –

+0

Dans mon cas particulier, Bar est abstrait et les méthodes usine retournent des objets de classes anonymes étendant Bar qui implémente une méthode publique définie comme abstraite dans Bar; les implémentations ferment sur la portée des arguments passés aux méthodes d'usine respectives. –

-1

oui:

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

Cela ne répond pas à la question. En fait, c'est à peu près ce qu'il essayait d'éviter. –