@EqualsAndHashCode 注解怎么用?

@EqualsAndHashCode 是 Lombok 库提供的一个注解,用于自动生成 equals(Object other) 和 hashCode() 方法的实现。

在 Java 中,当你需要比较两个对象是否相等(使用 equals() 方法)或需要将对象用作哈希表(如 HashMap 或 HashSet)的键时,通常需要重写 equals(Object other) 和 hashCode() 方法。这些方法的实现需要基于对象的属性来确保正确的行为。

然而,手动编写这些方法可能会很繁琐且容易出错。Lombok 的 @EqualsAndHashCode 注解可以帮助你自动生成这些方法,从而简化代码并提高正确性。

使用 @EqualsAndHashCode 注解时,可以指定需要包含在内的属性,或者排除某些属性。例如:

import lombok.EqualsAndHashCode;  
  
@EqualsAndHashCode(exclude = "id") // 排除id属性  
public class Person {  
    private int id;  
    private String name;  
    private int age;  
  
    // ... getters, setters, other methods ...  
}

在这个例子中,生成的 equals() 和 hashCode() 方法将只考虑 name 和 age 属性,而不考虑 id 属性。

你还可以使用 @EqualsAndHashCode.Include 注解来包含特定的字段,或者通过 @EqualsAndHashCode(callSuper = true) 来包含超类的 equals() 和 hashCode() 方法的实现(如果超类也重写了这些方法)。

使用 Lombok 的 @EqualsAndHashCode 注解可以显著减少样板代码,并使你的代码更加简洁和易读。同时,由于 Lombok 自动生成的代码通常比手动编写的代码更加准确和高效,因此使用此注解还可以提高代码的质量。

在 Lombok 中,@EqualsAndHashCode 注解用于自动生成 equals(Object other) 和 hashCode() 方法的实现。当这个注解用于一个类时,它会基于该类中声明的非静态、非瞬态(non-transient)字段来生成这些方法。

callSuper 参数是 @EqualsAndHashCode 注解的一个可选参数,它决定了生成的 equals 方法是否应该调用超类的 equals 方法。

  • 如果 callSuper 设置为 true,则生成的 equals 方法会首先调用超类的 equals 方法。这通常在你希望比较超类中的字段时很有用,特别是当超类本身也重写了 equals 方法时。
  • 如果 callSuper 设置为 false(或者没有指定,因为 false 是默认值),则生成的 equals 方法只会比较当前类中声明的字段。

这里是一个例子来说明 callSuper 的使用:

import lombok.EqualsAndHashCode;  
  
@EqualsAndHashCode(callSuper = true) // 调用超类的equals方法  
public class ChildClass extends ParentClass {  
    private String childField;  
  
    // getters, setters, other methods...  
}  
  
class ParentClass {  
    private String parentField;  
  
    // 必须重写equals和hashCode方法,或者也使用Lombok的@EqualsAndHashCode注解  
    // getters, setters, other methods...  
  
    // 假设这里有一个合适的equals和hashCode实现  
}

在上面的例子中,ChildClass 继承了 ParentClass,并且使用 @EqualsAndHashCode(callSuper = true) 注解。这意味着当比较两个 ChildClass 对象时,首先会调用 ParentClass 的 equals 方法来比较 parentField 字段,然后才会比较 ChildClass 中的 childField 字段。

如果 callSuper 设置为 false,则 ParentClass 的 equals 方法将不会被调用,只会比较 ChildClass 中的 childField 字段。

需要注意的是,如果你使用 callSuper = true,那么超类(在这个例子中是 ParentClass)也必须有一个合适的 equals 和 hashCode 实现,否则你可能会得到不期望的结果。如果超类没有重写 equals 和 hashCode,并且你设置了 callSuper = true,那么 ParentClass 将使用 Object 类的默认实现,这通常只比较对象的引用是否相等,而不是内容是否相等。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

因上精进,果上随缘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值