开发者

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

开发者 https://www.devze.com 2023-03-06 10:25 出处:网络 作者: Rookie_cc
目录@EqualsAndHashCode注解先来看问题1、定义一个基础类Car2、定义一个扩展类BYD继承Car3、分别new两个对象并比较4、查看比较结果解决办法总结@EqualsAndHashCode注解
目录
  • @EqualsAndHashCode注解
  • 先来看问题
    • 1、定义一个基础类Car
    • 2、定义一个扩展类BYD继承Car
    • 3、分别new两个对象并比较
    • 4、查看比较结果
  • 解决办法
    • 总结

      @EqualsAndHashCode注解

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

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

      开发者_Python开发

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

      先来看问题

      1、定义一个基础类Car

      /*javascript*
       * 汽车
       */
      @Data
      public class Car {
       
          /**
           * 颜色
           */
          private String color;
       
          /**
           * 续航
           */
          private Integer endurance;
       
      }

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

      /**
       * 比亚迪汽车
       */
      @Data
      public class BYD extends Car {
       
          /**
           * 价XsvbX格
           */
          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注解的使用及说明

      ---------------------------------或------------------------javascript------

      /**
       * 比亚迪汽车
       */
      @Getter
      @Sandroidetter
      public class BYD extends Car {
       
          /**
           * 价格
           */
          private Integer price;
       
      }

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

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号