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方法必须满足这三大特性

  • 相关阅读:
    中国历史朝代公元对照简表
    [Solved] DashBoard – Excel Service: The data sources may be unreachable, may not be responding, or may have denied you access.
    Delete/Remove Project from TFS 2010
    Sharepoint site showing system account instead of my username on the top right corner.
    你的成功在于你每天养成的习惯
    Internet Information Services is running in 32bit emulation mode. Correct the issue listed above and rerun setup.
    Prepare to back up and restore a farm (Office SharePoint Server 2007)
    Word中字号与磅值的对应关系
    How to: Change the Frequency for Refreshing the Data Warehouse for Team System
    UI Automation in WPF/Silverlight
  • 原文地址:https://www.cnblogs.com/rayguo/p/3777692.html
Copyright © 2011-2022 走看看