You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重写Employee类equals方法实现ID与姓名相等性判断及测试方案咨询

equals方法实现

按照Java重写equals的规范,结合仅校验ID和name的需求,实现逻辑如下:

  1. 首先判断两个对象是否为同一个引用,是则直接返回true,提升性能
  2. 判定对比对象是否为null,或者和当前对象类型不匹配,是则直接返回false
  3. 强制类型转换后,对比两个核心属性: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:18:03