加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 一个有效的equals(Object o)实现

发布时间:2020-12-15 05:15:46 所属栏目:Java 来源:网络整理
导读:在我写完标题之后,我读到了SO post,但仍然决定在Java中讨论有关bug的bug实现问题.这是我的正常实施 @Override public boolean equals(Object o){ if(o == null) return false; if(o instanceof CompositePk == false) return false; if(this == o) return tr
在我写完标题之后,我读到了SO post,但仍然决定在Java中讨论有关bug的bug实现问题.这是我的正常实施

@Override
        public boolean equals(Object o){
            if(o == null) return false;
            if(o instanceof CompositePk == false) return false;
            if(this == o) return true;
            CompositePk that = (CompositePk)o;
            return new EqualsBuilder().append(this.id,that.id)
                                      .append(this.bucketId,that.bucketId)
                                      .isEquals();
        }

使用Apache的EqualsBuilder来完成平凡的事情.比这更容易的是我的Netbean自动生成的equals(o)实现

@Override
        public boolean equals(Object obj){
        if (obj == null) {
                return false;
            }
            if (getClass() != obj.getClass()) {
                return false;
            }
            final TemplatesWrapper other = (TemplatesWrapper) obj;
            if (this.timeAdded != other.timeAdded && (this.timeAdded == null || !this.timeAdded.equals(other.timeAdded))) {
                return false;
            }
            return true;
    }

我从2个差异项目中获取这些,但他们都试图完成同样的事情,但使用diff方法.您认为哪种风格或者您发现有什么缺陷?

解决方法

我会这样做:

public boolean equals(Object ob) {
  if (ob == null) return false;
  if (ob == this) return true;

  if (!(ob instanceof MyClass)) return false; // OR
  if (ob.getClass() != getClass()) return false;

  // check relevant members
}

中间的两条线是不同的.一个允许子类相等(第一个),另一个不允许.使用合适的任何一种.

举个例子,Java的AbstractList类可能会使用第二种形式,因为List的确切实现是无关紧要的.重要的是,如果成员是平等的,并且处于相同的位置.

相反,Person类应该使用第一个表单(instanceof),因为如果有一个Student子类并且你调用Person.equals(Student)它可能返回true而不检查Student中的额外字段,而Student.equals(Person)可能会返回假.如果equals()不是可交换的,那你就是在寻找麻烦.

我倾向于使用由我的IDE(IntelliJ IDEA)生成的equals()方法,而不是为某些Apache库创建不必要的依赖,以获得微不足道的收益.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读