Lombok中@EqualsAndHashCode注解的使用及说明

作者:Rookie_cc 时间:2023-11-30 04:47:05 

@EqualsAndHashCode注解

@EqualsAndHashCode注解的作用就是自动实现model类的equals方法和hashcode方法。

我们在实际工作中经常会使用lombok来简化我们的开发

例如我们可以在定义的model类上添加@Data注解,从而免去手写get、set、toString、equals、hashcode等方法。

先来看问题

1、定义一个基础类Car

/**
* 汽车
*/
@Data
public class Car {

/**
    * 颜色
    */
   private String color;

/**
    * 续航
    */
   private Integer endurance;

}

2、定义一个扩展类BYD继承Car

/**
* 比亚迪汽车
*/
@Data
public class BYD extends Car {

/**
    * 价格
    */
   private Integer price;

}

3、分别new两个对象并比较

public class EqualsAndHashCodeTest {

public static void main(String[] args) {
       BYD bydBlue = new BYD();
       bydBlue.setPrice(150000);
       bydBlue.setColor("蓝色");
       bydBlue.setEndurance(1200);

BYD bydWhite = new BYD();
       bydWhite.setPrice(150000);
       bydWhite.setColor("白色");
       bydWhite.setEndurance(1200);

System.out.println("两个对象比较结果:" + bydBlue.equals(bydWhite));
   }

}

4、查看比较结果

Lombok中@EqualsAndHashCode注解的使用及说明

我们会发现明明new的是两个不同的对象,但是使用equals比较出来的结果却是true。

原因是它没有调用父类的中属性,而是直接使用的子类中的属性来生成hashcode,所以当子类中的属性参数一样时,使用equals比较结果的为true。

解决办法

添加@EqualsAndHashCode(callSuper = true)注解或者不使用@Data注解。

@EqualsAndHashCode(callSuper = true)

就是用自己的属性和从父类继承的属性来生成hashcode;

@EqualsAndHashCode(callSuper = false)

就是只用自己的属性来生成hashcode;

@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集, 和@EqualsAndHashCode默认是false。

例:

/**
* 比亚迪汽车
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class BYD extends Car {

/**
    * 价格
    */
   private Integer price;

}

Lombok中@EqualsAndHashCode注解的使用及说明

---------------------------------或------------------------------

/**
* 比亚迪汽车
*/
@Getter
@Setter
public class BYD extends Car {

/**
    * 价格
    */
   private Integer price;

}

Lombok中@EqualsAndHashCode注解的使用及说明

来源:https://blog.csdn.net/Rookie_cc/article/details/118415024

标签:Lombok,@EqualsAndHashCode,注解
0
投稿

猜你喜欢

  • c#委托详解和和示例分享

    2022-10-26 12:29:41
  • Android极光推送处理message遇到的坑解决

    2022-08-08 00:49:32
  • Java中遍历ConcurrentHashMap的四种方式详解

    2023-11-17 08:54:41
  • Android开发使用strings.xml多语言翻译解决方案

    2023-06-27 14:19:24
  • Android中使用Matrix控制图形变换和制作倒影效果的方法

    2022-11-23 07:35:23
  • spring cglib 与 jdk 动态代理

    2021-07-19 20:28:43
  • C#下解析HTML的两种方法介绍

    2021-07-03 16:08:21
  • Java在web页面上的编码解码处理及中文URL乱码解决

    2023-08-25 11:10:19
  • Flutter runApp到渲染上屏分析详解

    2023-06-27 12:09:45
  • Java流处理stream使用详解

    2021-09-17 18:27:58
  • Android仿一点资讯收藏Toast动画效果

    2022-01-15 18:42:33
  • Kotlin协程到底是如何切换线程的

    2022-03-03 13:52:39
  • Android实现Z轴布局效果

    2021-11-19 05:33:56
  • JAVA字符串占位符使用方法实例

    2021-09-20 17:30:27
  • Android 获取手机信息实例详解

    2021-08-21 00:22:34
  • Java语言实现最大堆代码示例

    2021-09-22 14:20:44
  • 简介Java的Hibernate框架中的Session和持久化类

    2023-04-17 14:41:13
  • Android为View添加拖放效果的方法实例

    2023-06-25 18:53:45
  • Java中Stream流中map和forEach的区别详解

    2022-07-09 12:24:43
  • MyBatis常用的jdbcType数据类型

    2023-09-18 19:09:35
  • asp之家 软件编程 m.aspxhome.com