Come fare riferimento alla classe esterna in un'altra istanza di una classe interna non statica?

StackOverflow https://stackoverflow.com/questions/309737

Domanda

Uso Apache Commons EqualsBuilder per creare il metodo equals per una classe interna Java non statica. Ad esempio:

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

Esiste una sintassi per cui posso fare riferimento al riferimento altro Foo oltre a dichiarare il metodo getMyFoo () ? Qualcosa come altro.Foo.this (che non funziona)?

È stato utile?

Soluzione

No.

Il modo migliore è probabilmente quello che hai suggerito: aggiungi un metodo getFoo () alla tua classe interna.

Altri suggerimenti

No, non è possibile senza un getter. La parola chiave "this" punterà sempre all'istanza corrente. Sono abbastanza curioso di sapere perché vorresti farlo ... sembra che tu stia facendo la composizione nel modo sbagliato.

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

Poiché l'utilizzo di Foo.this limita la creazione della classe interna (Foo myFoo = new Foo (); myFoo.new Bar (); ad un'istanza direi che è molto più pulito.

Si

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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top