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

相关推荐
fouryears_2341738 分钟前
Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
开发语言·flutter·客户端·dart
我好喜欢你~1 小时前
C#---StopWatch类
开发语言·c#
桦说编程2 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen2 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研2 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
没有bug.的程序员3 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋4 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
cui__OaO4 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
阿华的代码王国4 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~4 小时前
《设计模式》装饰模式
java·设计模式