Item 8: Obey the general contract when overriding equals

Item 8 ~ 12讲了Methods Common to All Objects,Object类里面的一些不是final的方法。
这篇讲的是override equals方法的时候要遵守的约定。

首先,如果不需要覆写那是最好的,如果满足了下面的条件就不需要覆写:

不需要override的情况:

  • Each instance of the class is inherently unique
    比如Thread代表活动实体,而不是值(不懂)。
  • 不关心类是否提供「逻辑相等」的测试功能。
  • superclass已经覆写了equals。
  • 类是私有的,可以确定equals不会被调用。

需要覆写的情况

如果类有自己的「逻辑相等」概念的话。比如String,不但要比对instance,还要比对每个char是否一致,instance一致自然是相等的(自反性reflexive),instance不相等,每个char相等,也返回true。

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = count;
            if (n == anotherString.count) {
                int i = 0;
                while (n-- != 0) {
                    if (charAt(i) != anotherString.charAt(i))
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

覆写的时候需要遵守的general contract

  • reflexive
    x.equals(x) must be true
  • symmetric
    x.equals(y) must be the same as y.equals(x)
  • transitive
    x-->y-->z
  • consistent
    多次调用结果一致。
  • 非null类型的引用,x.equals(null)必须返回false

注意

这些contract看似很容易符合,但是文中对每个情形都举了反例,告诉读者这些条件是很容易不知不觉见违反的。具体可看文末链接。

当完成编写之后,要编写单元测试来验证上面的这些特性。

See also:
http://blog.csdn.net/partner4java/article/details/7066349

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,850评论 19 139
  • 文章作者:Tyan博客:noahsnail.com | CSDN | 简书 CHAPTER3 Method...
    SnailTyan阅读 4,028评论 1 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,508评论 18 399
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 6,268评论 0 3
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,488评论 11 349

友情链接更多精彩内容