zoukankan      html  css  js  c++  java
  • 编写高质量equals方法

    什么是equals方法

      指示其他某个对象是否与此对象相等,equals方法存在Object类中,我们编写的类继承Object,可以覆盖Object的equals方法来实现我们的逻辑,去判断两个对象是否相等。

    Object类中的equals方法

      一起来看看Object类中的源代码

        public boolean equals(Object obj) {
        return (this == obj);
        }

      我们可以观察到几点:

    1. equals方法是public修饰的,外部类是可以访问的    
    2. equals方法的返回值boolean,true为两个对象相等,false为两个对象不等
    3. 参数类型为Object,是其子类都可以比较
    4. 方法体判断的是两者的引用是不是相等

    实际上为什么要编写equals

      在我们的实际的操作中,有下面的例子:

        @Test
        public void whyUseEquals() {
            User user1 = new User("xujianguo", 21);
            User user2 = new User("xujianguo", 21);
            System.out.println(user1.equals(user2));
        }

    发user1和user2的name都是xujianguo,age都是21的,按照我们的逻辑是同一个人,都是如果没有重写equals方法,默认采用Object的equals方法的话,结果就是false的,所以我们必须实现equals来实现我们的逻辑。

    高质量equals方法

      1.使用instanceof操作符检查参数是否为正确的类型

        因为equals的参数为Object,你的类是Person,但是这个参数很可能不是Person类型的,可能是User类型的,这样的话就不符合你的判断的,使用instanceof可以判断你的参数是否为正确的你要的处理的类型。

        @Override
        public boolean equals(Object object) {
            if(!(object instanceof Person)) {
                return false;
            } else {
                //...
                return true;
            }
        }

      2.把参数转化为正确的类型

        在前面进行了类型的判断后,就需要进行类型的转换,转换成需要的类型我们才能进行后续的操作。

        @Override
        public boolean equals(Object object) {
            if(!(object instanceof Person)) {
                return false;
            } else {
                Person person = (Person)object;
                //...
                return true;
            }
        }

      3.匹配参数中的域情况

        这里就是你的逻辑的实现,你的两个对象要怎么样才相等,对于我的这个Person类来说,name一样并且age一样,两个就相等了。

        @Override
        public boolean equals(Object object) {
            if(!(object instanceof Person)) {
                return false;
            } else {
                Person person = (Person)object;
                if(person.getName().equals(name) && person.getAge() == age) {
                    return true;
                } else {
                    return true;
                }
            }
        }

      4.编写完成equals方法后,检查其三大特性:自反性、对称性、传递性

    • 自反性:对于任何非空引用值x,都有x.equals(x)返回true    
    • 对称性:对于任何非空引用值x、y,当x.equals(y)返回true的时候,y.equals(x)也返回true
    • 传递性:对于任何非空引用值x、y、z,当x.equals(y)并且y.equals(z)都返回true的时候,有x.equals(z)返回true

      高质量的equals方法必须满足这三大特性

  • 相关阅读:
    ssh 的参数 -o + 检查是否是无密码访问
    Linux下SVN服务器同时支持Apache的http和svnserve独立服务器两种模式且使用相同的访问权限账号
    Linux 下jJKD,Tomcat部署
    [转]深入理解Java的接口和抽象类
    Java 培训笔记
    十三、MySQL性能优化
    十二、MySQL用户管理
    十一、MySQL触发器
    十、MySQL视图
    九、MySQL存储过程和函数
  • 原文地址:https://www.cnblogs.com/rayguo/p/3777692.html
Copyright © 2011-2022 走看看