2

由于在两个地方处理班级的结构变化很痛苦,我经常这样做:

class A {
  class C{}
  class B{}
  private B bChild;
  private C cChild;

  private Object[] structure() {
    return new Object[]{bChild, cChild};
  }

  public int hashCode() {
      Arrays.hashCode(structure());
  }

  public boolean equals(Object that) {
    //type check here
    return Arrays.equals(this.structure(), ((A)that).structure());
  }
}

除了对基元进行装箱外,这种方法还有什么不好的?可以改进吗?

4

3 回答 3

0

这是一种重用库方法的聪明方法,这通常是一个好主意;但它会进行大量的过度分配和数组操作,这在这些常用方法中可能非常低效。总而言之,我会说它很可爱,但它不会通过评论。

于 2013-10-24T04:29:16.637 回答
0

在 JDK 7 中,他们添加了 java.util.Objects 类。它实际上以一种提醒您所写内容的方式实现了哈希和等于实用程序。关键是这种方法实际上得到了 JDK 开发人员的认可。Ernest Friedman-Hill 有一个观点,但在大多数情况下,我不认为以牺牲可读性为代价节省额外的一些机器指令是值得的。

例如:哈希实用程序方法实现为:

public static int hash(Object... values) {
    return Arrays.hashCode(values);
}
于 2013-10-24T21:02:22.440 回答
-2

熟悉代码的人会更难看到发生了什么。正如我之前错误的答案所证明的那样,它比列出各个字段不那么“明显”。确实,“等于”通常是通过传入的“对象”实现的,因此值得商榷,但输入是在引用相等检查之后强制转换的。这里情况不同。

一种改进可能是将数组存储为私有数据成员,而不是使用结构方法创建它,牺牲一点内存以避免装箱。

于 2013-10-24T04:01:57.923 回答