为非静态内部类实现有意义的equals方法

时间:2014-03-10 20:41:03

标签: java inner-classes equality

我目前想知道是否有一种在Java中为非静态内部类实现equals方法的好方法。我基本上是一个类Foo,内联类Bar就像这样:

public class Foo {

  private final String foo; // constructor omitted

  public /* non-static */ class Bar {

    private final String bar; // constructor omitted

    @Override
    public boolean equals(Object other) {
      return other != null && other.getClass() == getClass()
        && ((Bar) other).bar.equals(this.bar)
        && Foo.this.equals(Foo.((Bar) other)); // Will, of course, not compile.
    }
  }

  @Override
  public boolean equals(Object other) {
    return other != null && other.getClass() == getClass()
      && ((Foo) other).foo.equals(foo);
  }
}

我的课程实际上要复杂得多,我想在Foo#equals中重用Bar#equals方法,以便为我节省大量代码。我现在正在考虑将“内部阶级关系”明确化,以便能够引用“外部”类。但是,我必须手动添加访问器方法,我想避免这种情况。我无法摆脱应该采用Java方法的感觉。

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。当您需要传递代表某些数据集的唯一标识符但没有数据或想要传输数据的“Key”对象时,通常会这样做。

class SomeData {
    private String data;
    public static class Key {
        private final int firstId;
        private final int secondId; 

        public Key(int firstId, int secondId) {
            this.firstId = firstId;
            this.secondId = secondId;
        }

        public boolean equals(Object x) {
            if(!(x instanceof Key))
                return false;
            Key key = ((Key)x);

            return this.firstId == key.firstId 
            && this.secondId == key.secondId;

        }

        // implement hashCode as well
    }
}

在上面的例子中,内部类是静态的,但这并不重要。我设置它的唯一原因是外部类可以构造它。确保当你覆盖.equals时,你也得到了.hashCode。他们应该互相改变。