[java] 更好的书写equals方法-汇率换算器的实现(4)
[java] 更好的书写equals方法-汇率换算器的实现(4)
Table of Contents
1 系列文章地址
2 完美的一个equals方法应该包含的内容
- 首先判断两个对象是不是同一个对象
if (this == otherObject) return true;
- 当另一个对象为空时, 返回false
if (otherObject == null) return false;
- 比较的两个类的类型应该相同
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;
- 最后进行类型转换, 比较各个字段的大小
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); }