[java] 更好的书写equals方法-汇率换算器的实现(4)

时间:2024-05-22 20:03:50

[java] 更好的书写equals方法-汇率换算器的实现(4)

[java] 更好的书写equals方法-汇率换算器的实现(4)

2 完美的一个equals方法应该包含的内容

  1. 首先判断两个对象是不是同一个对象
    if (this == otherObject) return true;
    
  2. 当另一个对象为空时, 返回false
    if (otherObject == null) return false;
    
  3. 比较的两个类的类型应该相同
    if (getClass() != otherObject.getClass()) return false;
    

    但是有一些人可能会使用下面的方式:

    if (!(otherObject instanceof ThisClass)) return false;
    

    这样会导致一个问题, 如:

    // 父类
    class People {
    public People(String name) {
    this.name = name;
    } public boolean equals(Object obj) {
    if (this == obj) return true; if (obj == null) return false; // if (getClass() != obj.getClass()) return false;
    if (!(obj instanceof People)) return false; People other = (People) obj;
    return name.equals(other.name);
    } private String name;
    } // 子类
    class Student extends People {
    public Student(String name, String studentID) {
    super(name);
    this.studentID = studentID;
    } public boolean equals(Object obj) {
    if (!super.equals(obj)) return false; Student s = (Student) obj; return studentID == s.studentID;
    } private String studentID;
    }

    当在main函数中运行下面的例子时, 就会抛出ClassCastException的异常

    public class Demo {
    public static void main(String[] args) {
    People p1 = new People("zhang");
    Student s1 = new Student("zhang", "ID1"); System.out.println(s1.equals(p1));
    }
    }

    因此在具体实现过程中建议使用:

    if (getClass() != otherObject.getClass()) return false;
    
  4. 最后进行类型转换, 比较各个字段的大小
    People other = (People) obj;
    return name.equals(other.name);

3 将汇率转换器中的部份代码进行修改

将Money类中的equals方法进行修改:

/**
当货币单位以及货币量都相等时, 两个货币对象就相等
@param obj 货币
@return 相等为<code>true</code>, 不相等为<code>false</code>
*/
public boolean equals(Object obj) {
if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Money other = (Money) obj;
return amount == other.amount
&& unit.equals(other.unit);
}

Date: 2014-05-17 Sat

Author: Zhong Xiewei

Org version 7.8.11 with Emacs version 24

Validate XHTML 1.0