@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,可以显著减少代码量并提高代码的可维护性和一致性。

相关推荐
霸道流氓气质3 分钟前
Saga模式入门与实战:编排与协同模式、补偿设计原则与Java生产级实现
java·开发语言
江湖有缘9 分钟前
Docker实战 | 使用Docker部署Readeck书签管理工具
java·docker·eureka
小毛驴85012 分钟前
mvn help:effective-settings 与 mvn help:effective-pom
java·linux·前端
silvamux_26 分钟前
OpenAI Python SDK v1 迁移实战
开发语言·python
silvamux_26 分钟前
MiniMax API 调用教程:兼容 OpenAI 写法
java·数据库·elasticsearch
旋生万物26 分钟前
螺旋数不是玄学:Python 实现广义复数与等角螺线
开发语言·人工智能·python·云原生·aigc·软件工程·后端开发
半杯咖啡半行码27 分钟前
Linux字符设备驱动实战:ioctl接口与GPIO操作指南
linux·开发语言
ZoeLandia28 分钟前
TypeScript 07:工程化——import type、声明文件与 tsconfig
开发语言·前端·typescript
染指111030 分钟前
145.Agent-LangGraph基础概念和安装和简单代码示例
java·服务器·数据库·langchain·agents
Doker 多克32 分钟前
ForkJoinPool 详解
java·多线程