Como referenciar a classe externa em outra instância de uma classe interna não-estática?
-
08-07-2019 - |
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)?
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);
}
}