Ответ 1
Нет.
Лучший способ - это то, что вы предложили: добавьте метод getFoo() в свой внутренний класс.
Я использую Apache Commons EqualsBuilder для создания метода equals для нестатического внутреннего класса Java. Например:
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
}
}
Есть ли синтаксис, с помощью которого я могу ссылаться на ссылку other
Foo
, кроме объявления метода getMyFoo()
? Что-то вроде other.Foo.this
(что не работает)?
Нет.
Лучший способ - это то, что вы предложили: добавьте метод getFoo() в свой внутренний класс.
Нет, невозможно без геттера. Ключевое слово 'this' всегда укажет на текущий экземпляр. Мне очень любопытно, почему вы хотели бы сделать это... похоже, что вы делаете неправильную композицию.
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);
}
}
С тех пор, как Foo.this ограничивает создание внутреннего класса (Foo myFoo = new Foo(); myFoo.new Bar(); в экземпляр, я бы сказал, что это намного чище.
да
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);
}
}