Como referenciar a classe externa em outra instância de uma classe interna não-estática?

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

Pergunta

Eu estou usando o Apache Commons EqualsBuilder para construir o método é igual para uma classe interna não-estática Java. Por exemplo:

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 sintaxe pelo qual eu posso referir-se a referência other de Foo além de declarar o método getMyFoo()? Algo como other.Foo.this (que não funciona)?

Foi útil?

Solução

No.

A melhor maneira é provavelmente o que você sugeriu:. Adicionar um método getFoo () para sua classe interna

Outras dicas

Não, não é possível sem um getter. O 'isto' palavra-chave irá sempre apontar para a instância atual. Estou muito curioso por que você iria querer fazer isso ... parece que você está fazendo a composição no caminho errado.

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

Desde usando Foo.this limita criação da classe interna (Foo myFoo = new Foo (); myFoo.new Bar ();. A uma instância Eu diria que este é muito mais limpo

Sim:

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);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top