Как сослаться на внешний класс в другом экземпляре нестатического внутреннего класса? - PullRequest
14 голосов
/ 21 ноября 2008

Я использую 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 (что не работает)?

Ответы [ 3 ]

6 голосов
/ 21 ноября 2008

Нет.

Вероятно, наилучший способ - это то, что вы предложили: добавьте метод getFoo () в свой внутренний класс.

2 голосов
/ 21 ноября 2008

Нет, без геттера невозможно. Ключевое слово 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 (); к примеру, я бы сказал, что это намного чище.

0 голосов
/ 21 ноября 2008

да

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