【问题标题】:Java compare this class to that class for equalityJava比较这个类和那个类是否相等
【发布时间】:2013-05-10 03:04:17
【问题描述】:

我的任务是重写equals()方法。我对使用Stack12<E> that = (Stack12<E>)o;o instanceof Stack12 有一些顾虑。我想知道他们是不是不好的做法,尤其是我在 for 循环中使用 that 的方式对我来说有点不合适。

还有其他方法可以将此类与其他对象进行比较吗?还是我的比较方法足够稳健?

  public boolean equals(java.lang.Object o){
  if(o == this) return true;
  if(o == null || !(o instanceof Stack12)){
     return false;
  }

  Stack12<E> that = (Stack12<E>)o;
  if(this.size != that.size || this.capacity != that.capacity ){
     return false;
  }
  for(int i = 0; i < this.size; i++){
     if( that.stack[i] != this.stack[i] ){
        return false;
     }
  }
  return true;
 }

【问题讨论】:

  • 我对将对象转换为泛型类型感到不舒服。而且我认为我在某处使用 instanceof 在 Java 中阅读是一种不好的做法。
  • 我要补充的唯一警告是,无论何时覆盖equals(...),您还需要覆盖hashCode()。糟糕,我确实看到了一个主要问题——已发布答案。

标签: java compare equality


【解决方案1】:

我要补充的一个警告是,每当您覆盖equals(...) 时,您还需要覆盖hashCode()。我同意看到 instanceof 被过度使用会让我担心代码异味,但我认为你别无选择,只能在这种情况下使用 instanceof。至于转换为泛型,我可能错了,但是在运行时,泛型确实不存在,所以可能没有实际意义。

我看到的一个潜在的主要问题是您在 for 循环中使用了==。如果您的堆栈数组使用对象,您应该在循环内使用equals(...)。您的类是通用的这一事实表明堆栈数组确实包含对象,但我不确定,因为我们没有看到这一点。

【讨论】:

  • 感谢您的 equals(...) 提示
  • @Jack:不客气,但请注意,如果堆栈包含原语,这不是问题。
  • o == null 是不必要的。 instanceof 对于 null 将始终为 false。
  • 哦,另一个问题。在 junit tester 中运行代码后,有一种情况失败。当我有类似 Stack s1 = new blah blah;堆栈 s2 = 等等等等。测试表明它们是相等的。如何测试泛型的类型?
  • @Jack:由于类型擦除,我不确定你是否可以。
猜你喜欢
  • 2017-09-22
  • 1970-01-01
  • 2013-08-18
  • 2016-10-20
  • 2021-03-18
  • 1970-01-01
  • 2021-09-14
  • 2023-03-11
  • 2010-12-05
相关资源
最近更新 更多