@EqualsAndHashCode注解使用

一,@EqualsAndHashCode注解来自于Lombok

@EqualsAndHashCode 是 Lombok 库提供的一个注解,用于自动生成 equals 和 hashCode 方法。这两个方法在 Java 中非常重要,特别是在集合框架中使用时,它们确保了对象的正确比较和哈希值的一致性。

二,为什么使用 @EqualsAndHashCode注解

1,减少样板代码:手动编写 equals 和 hashCode 方法非常繁琐且容易出错。

2,提高代码可读性:使用 Lombok 自动生成这些方法可以让类的定义更加简洁。

3,保证一致性:Lombok 自动生成的方法遵循 Java 官方推荐的最佳实践。

三,如何使用 @EqualsAndHashCode

1,引入依赖: 在项目的 build 文件中添加 Lombok 依赖。例如,在 Maven 的 pom.xml 文件中添加:

XML 复制代码
<dependencies>
    <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <version>1.18.24</version> <!-- 选择最新版本 -->
       <scope>provided</scope>
    </dependency>
</dependencies>

2,应用注解 : 在类定义上加上 @EqualsAndHashCode 注解。可以指定不同的选项来自定义生成的方法。

3,常见选项
of:指定哪些字段用于生成 equals 和 hashCode 方法。
callSuper:是否调用父类的 equals 和 hashCode 方法。
exclude:排除某些字段不参与生成。
doNotUseGetters:是否使用 getter 方法获取字段值,默认为 false。

4,示例

java 复制代码
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@EqualsAndHashCode(of = {"name", "age"}) // 指定使用 name 和 age 字段
//@EqualsAndHashCode(exclude = {"email"}) // 排除掉email字段,和上面一行选一个就行
public class User {

    private String name;
    private int age;
    private String email; // 不参与 equals 和 hashCode 计算

    // 其他方法和逻辑
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        User user1 = new User();
        user1.setName("张三");
        user1.setAge(25);
        user1.setEmail("zhangsan@example.com");

        User user2 = new User();
        user2.setName("张三");
        user2.setAge(25);
        user2.setEmail("zhangsan1@example.com");

        System.out.println(user1.equals(user2)); // 输出 true
        System.out.println(user1.hashCode() == user2.hashCode()); // 输出 true
    }
}

四,注意事项

1,字段顺序:@EqualsAndHashCode 默认按照字段声明的顺序进行处理,因此字段顺序可能会影响结果。

2,性能问题:如果类中有大量字段,生成的 equals 和 hashCode 方法可能会比较复杂,影响性能。

3,继承关系:如果类有继承关系,需要考虑是否调用父类的 equals 和 hashCode 方法。

五,总结

通过使用 @EqualsAndHashCode,可以显著减少代码量并提高代码的可维护性和一致性。

相关推荐
敲敲了个代码2 分钟前
隐式类型转换:哈基米 == 猫 ? true :false
开发语言·前端·javascript·学习·面试·web
专注VB编程开发20年15 分钟前
C#全面超越JAVA,主要还是跨平台用的人少
java·c#·.net·跨平台
小信啊啊17 分钟前
Go语言切片slice
开发语言·后端·golang
阿华hhh20 分钟前
Linux系统编程(标准io)
linux·开发语言·c++
南_山无梅落33 分钟前
9.Python3集合(set)增删改查和推导式
java·开发语言
sg_knight1 小时前
拥抱未来:ECMAScript Modules (ESM) 深度解析
开发语言·前端·javascript·vue·ecmascript·web·esm
爱笑的眼睛111 小时前
超越MSE与交叉熵:深度解析损失函数的动态本质与高阶设计
java·人工智能·python·ai
程序喵大人1 小时前
推荐个 C++ 练习平台
开发语言·c++·工具推荐
全靠bug跑1 小时前
Spring Cloud OpenFeign 实战三部曲:快速集成 · 连接池优化 · 客户端抽取
java·spring boot·openfeign