@EqualsAndHashCode(callSuper = true) 注解的作用

场景设定
假设存在父类 IotMessage 和子类 PointCheckMessage(即你的代码),结构如下:
java
运行
// 父类:包含一个标识消息类型的属性
@Data
public class IotMessage {
    private String messageType; // 消息类型(如"点检消息"、"报警消息")
}

// 子类:继承自IotMessage,添加自身属性
@Data
@EqualsAndHashCode(callSuper = true) // 关键注解
public class PointCheckMessage extends IotMessage {
    private String title;
    private String content;
    private Long configId;
}
测试案例
我们创建两个 PointCheckMessage 对象,对比它们的 equals() 结果:
java
运行
public class Test {
    public static void main(String[] args) {
        // 对象1:父类属性messageType="check",子类属性title="点检1"
        PointCheckMessage msg1 = new PointCheckMessage();
        msg1.setMessageType("check"); // 父类属性
        msg1.setTitle("点检1");
        msg1.setContent("内容1");
        msg1.setConfigId(1L);

        // 对象2:父类属性messageType="check",子类属性title="点检1"(与msg1完全相同)
        PointCheckMessage msg2 = new PointCheckMessage();
        msg2.setMessageType("check"); // 父类属性
        msg2.setTitle("点检1");
        msg2.setContent("内容1");
        msg2.setConfigId(1L);

        // 对象3:父类属性messageType="alarm"(不同),子类属性与msg1相同
        PointCheckMessage msg3 = new PointCheckMessage();
        msg3.setMessageType("alarm"); // 父类属性不同
        msg3.setTitle("点检1");
        msg3.setContent("内容1");
        msg3.setConfigId(1L);

        // 比较结果
        System.out.println(msg1.equals(msg2)); // true(父类+子类属性全相同)
        System.out.println(msg1.equals(msg3)); // false(父类属性不同)
    }
}
关键说明
由于 @EqualsAndHashCode(callSuper = true),生成的 equals() 方法会同时检查:
父类 IotMessage 的 messageType 属性;
子类 PointCheckMessage 自身的 title、content、configId 等属性。
如果去掉 callSuper = true(即默认 callSuper = false):
生成的 equals() 只会检查子类自身属性,忽略父类的 messageType;
此时 msg1.equals(msg3) 会返回 true(因为子类属性相同),但逻辑上两者的消息类型不同,显然是错误的。
这个案例体现了 callSuper = true 的核心作用:确保子类对象的相等性判断包含父类属性,避免因忽略父类状态导致的逻辑错误。
posted @ 2025-11-03 09:31  太阳终将升起  阅读(26)  评论(0)    收藏  举报