Java 如何在非静态内部类的另一个实例中引用外部类?

Java 如何在非静态内部类的另一个实例中引用外部类?,java,syntax,reference,inner-classes,Java,Syntax,Reference,Inner Classes,我正在使用ApacheCommonsEqualsBuilder为非静态Java内部类构建equals方法。例如: import org.apache.commons.lang.builder.EqualsBuilder; public class Foo { public class Bar { private Bar() {} public Foo getMyFoo() { return Foo.this }

我正在使用ApacheCommonsEqualsBuilder为非静态Java内部类构建equals方法。例如:

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
    }
}
除了声明
getMyFoo()
方法外,是否还有语法可以用来引用
other
Foo
引用?类似于
other.Foo.this
(它不工作)?


最好的方法可能是您建议的:向内部类添加getFoo()方法。

不,没有getter是不可能的。“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);
    }
}

这并不能回答问题。事实上,这正是他试图避免的。假设Bar的构造函数是私有的,实例是由Foo上定义的工厂方法创建的;此外,Bar的每个实例都应该绑定到Foo的一个实例。使用静态内部类可以做到这一点,但语言功能的全部要点是re是为了简化这种用法。哦,两个类都需要能够引用彼此的私有成员。在我的特殊情况下,Bar是抽象的,工厂方法返回匿名类的对象,这些匿名类扩展了Bar,实现了在Bar中定义为抽象的公共方法;实现接近传递给t的参数的范围当然,在不重写hashcode的情况下重写equals会破坏对象的契约;Bar需要有公共int hashcode(){return foo.hashcode();}