重写Employee类equals方法实现ID与姓名相等性判断及测试方案咨询
equals方法实现
按照Java重写equals的规范,结合仅校验ID和name的需求,实现逻辑如下:
- 首先判断两个对象是否为同一个引用,是则直接返回true,提升性能
- 判定对比对象是否为null,或者和当前对象类型不匹配,是则直接返回false
- 强制类型转换后,对比两个核心属性:int类型的employeeId直接用
==对比,String类型的name用Objects.equals对比,避免空指针异常
同时需要配套重写hashCode方法,符合Java规范(equals返回true的两个对象hashCode必须一致,否则存入HashSet、HashMap等哈希结构的集合时会出现逻辑异常)。
首先在类顶部引入工具类:
import java.util.Objects;
替换原有equals方法并新增hashCode方法:
@Override public boolean equals(Object obj) { // 同一引用直接判定相等 if (this == obj) { return true; } // 空对象或类型不匹配直接判定不等 if (obj == null || getClass() != obj.getClass()) { return false; } Employee other = (Employee) obj; // 仅校验ID和name,时薪不参与相等判定 return employeeId == other.employeeId && Objects.equals(name, other.name); } @Override public int hashCode() { // 仅用ID和name生成hashCode,和equals逻辑保持一致 return Objects.hash(employeeId, name); }
说明:如果需要支持子类对象和父类对象相等判定,可以把getClass() != obj.getClass()替换为!(obj instanceof Employee)
测试实现方案
测试需要覆盖所有边界场景,推荐用JUnit单元测试框架实现,覆盖以下测试用例:
- 自反性测试:同一个对象和自身对比返回true
- 相等场景测试:ID和name一致、时薪不同的两个对象返回true
- ID相同、name不同的两个对象返回false
- name相同、ID不同的两个对象返回false
- ID和name都不同的两个对象返回false
- 和null值对比返回false
- 和非Employee类型的对象对比返回false
- 相等的两个对象hashCode一致(符合Java规范)
JUnit 5 测试代码示例:
package employees; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class EmployeeTest { @Test void testEquals() { // 基准测试对象 Employee baseEmp = new Employee("张三", 1001, 50.0); // 自反性校验 assertEquals(baseEmp, baseEmp); // 核心属性相等校验(时薪不同不影响结果) Employee sameAttrEmp = new Employee("张三", 1001, 70.0); assertEquals(baseEmp, sameAttrEmp); // ID相同、name不同 Employee diffNameEmp = new Employee("李四", 1001, 50.0); assertNotEquals(baseEmp, diffNameEmp); // name相同、ID不同 Employee diffIdEmp = new Employee("张三", 1002, 50.0); assertNotEquals(baseEmp, diffIdEmp); // ID和name都不同 Employee diffAllEmp = new Employee("李四", 1002, 50.0); assertNotEquals(baseEmp, diffAllEmp); // 和null对比 assertNotEquals(baseEmp, null); // 和其他类型对象对比 assertNotEquals(baseEmp, "测试字符串"); } @Test void testHashCode() { Employee emp1 = new Employee("张三", 1001, 50.0); Employee emp2 = new Employee("张三", 1001, 70.0); // 相等对象hashCode必须一致 assertEquals(emp1.hashCode(), emp2.hashCode()); } }
内容的提问来源于stack exchange,提问作者Mv2156
相关产品推荐
相关产品推荐

