2008-11-21 18 views
13

Ich benutze den Apache Commons EqualsBuilder, um die equals-Methode für eine nicht statische innere Java-Klasse zu erstellen. Zum Beispiel:Wie verweist man auf die äußere Klasse in einer anderen Instanz einer nicht statischen inneren Klasse?

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

Gibt es Syntax, mit denen ich zu other ‚s Foo Referenz verweisen neben Deklarieren der getMyFoo() Methode? So etwas wie other.Foo.this (was nicht funktioniert)?

Antwort

5

Nr

Der beste Weg ist wahrscheinlich das, was Sie vorgeschlagen: ein getFoo() -Methode, um Ihre innere Klasse hinzuzufügen.

2

Nein, nicht möglich ohne Getter. Das Schlüsselwort 'this' verweist immer auf die aktuelle Instanz. Ich bin ziemlich neugierig, warum du das machen willst ... scheint, als würdest du falsch komponieren.

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

Da die Verwendung Foo.this Schaffung der inneren Klasse begrenzt (Foo myFoo = new Foo(); myFoo.new Bar (.), Zu einer Instanz ich dies viel sauberer ist würde sagen

+0

Angenommen, Bar Konstruktor ist privat und Instanzen von Factory-Methoden definierten auf Foo erstellt, auch jede Instanz von Bar sollte zu einer Instanz von Foo gebunden Es ist möglich, dies mit statischen inneren Klassen zu tun. aber der springende Punkt des Sprachfeatures ist, solche Verwendung zu vereinfachen. –

+0

Oh, und beide Klasse Es muss möglich sein, sich auf die privaten Mitglieder des anderen zu beziehen. –

+0

In meinem speziellen Fall ist Bar abstrakt, und die Factory-Methoden geben Objekte von anonymen Klassen zurück, die Bar erweitern, die eine öffentliche Methode implementieren, die in Bar als abstrakt definiert ist; Die Implementierungen schließen den Bereich der Argumente, die an die jeweiligen Factory-Methoden übergeben werden. –

-1

ja:

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

Dies beantwortet die Frage nicht. In Wirklichkeit ist es genau das, was er vermeiden wollte. –

Verwandte Themen