Lombok @Data使用的坑

这篇具有很好参考价值的文章主要介绍了Lombok @Data使用的坑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

​ 在开发过程中,Lombok为我们提供了非常便捷的开发。使用注解,就能帮助我们生成get set 方法,使代码看起来更加优雅。但是@Data注解在有些情况下会有坑, 使用过程中慎用。

坑在什么地方

@Data
public class Person1 {
    private String idCard;
    private String sex;
}

@Data
@AllArgsConstructor
public class Student extends Person1 {
    private String school;
}

上面是两个常见的类,Student继承Person1.我们看下Student生成的class文件

//equals()方法
public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof Student)) {
            return false;
        } else {
            Student other = (Student)o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                Object this$school = this.getSchool();
                Object other$school = other.getSchool();
                if (this$school == null) {
                    if (other$school != null) {
                        return false;
                    }
                } else if (!this$school.equals(other$school)) {
                    return false;
                }

                return true;
            }
        }
    }
    //hashCode 方法
   public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $school = this.getSchool();
        int result = result * 59 + ($school == null ? 43 : $school.hashCode());
        return result;
    }   

通过观察发现Student类重写了equals和hashCode方法。但是重写的这些方法里面只有本来的字段信息,没有父类的字段信息。

测试类

public class DateTest {
    public static void main(String[] args) {
        Student student1 = new Student("2");
        student1.setIdCard("2212");
        student1.setSex("1");
        Student student2 = new Student("2");
        student2.setIdCard("3333");
        student2.setSex("2");
        System.out.println(student1 == student2);
        System.out.println(student1.equals(student2));
        Map<Student,String> dataTestStringMap = new HashMap<>();
        dataTestStringMap.put(student1,student2.getSchool());
        dataTestStringMap.put(student2,student2.getSchool());
        System.out.println(dataTestStringMap.size());

        System.out.println(student1.hashCode());
        System.out.println(student2.hashCode());
    }
}

执行结果

false
true
1
109
109

你会发现 student1 和 student2 是两个对象,但是他们的hashCode 是相同的,并且equals方法结果是true。当我们使用hashCode和equals方法的时候,就会出现问题。

解决方案

方案一: 在student类上加上@EqualsAndHashCode(callSuper = true) 注解,重写父类的hashCode()和equals()

方案二: 按需加setter和getter

@Setter
@Getter
@AllArgsConstructor
public class Student extends Person1 {

    private String school;
}

结果我这里就不进行验证了,读者感兴趣的,请自行验证。

Lombok 对 @Data注解的解释

文档链接: https://projectlombok.org/features/Data

有兴趣的可以,阅读一下。

总结

​ Lombok 是一个很优秀的Java库,简单的几个注解,可以干掉一大片的模版代码。当我们使用的时候,要知其然,也要知其所以然,这样才能避免不必要的坑。文章来源地址https://www.toymoban.com/news/detail-803230.html

到了这里,关于Lombok @Data使用的坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA开发运维(Jenkins中踩的坑)

    最近尝试通过Jenkins来自动化部署项目,没想到还踩了很多坑。Jenkins部署的基本原理: 通过Jenkins服务器拉取gitlab上的代码进行打包,推送到目标服务器上,并运行启动脚本。 那么Jenkins就要解决三个问题。 1.连接上目标服务器 2.进行打包,并推送到目标服务器对应的目录。

    2023年04月13日
    浏览(53)
  • 使用Java 17中的record替代Lombok的部分功能

    在DD长期更新的Java新特性专栏中,已经介绍过Java 16中开始支持的新特性:record的使用。 之前只是做了介绍,但没有结合之前的编码习惯或规范来聊聊未来的应用变化。最近正好因为互相review一些合作伙伴的代码,产生了一些讨论话题,主要正针对于有了 record 之后,其实之前

    2024年02月02日
    浏览(41)
  • MyBatis:生命周期、作用域、结果集映射 ResultMap、日志、分页、使用注解开发、Lombok

    理解不同 作用域 和 生命周期 类别是至关重要的,因为错误的使用会导致非常严重的 并发问题 。 SqlSessionFactoryBuilder 一旦创建了 SqlSessionFactory,就不再需要它了; 最佳作用域 是方法作用域(也就是局部方法变量)。 SqlSessionFactory :相当于 数据库连接池 一旦被创建就应该在

    2024年02月02日
    浏览(56)
  • SpringBoot开发小技巧使用(DEBUG、启动图标修改、Lombok、devtools、Spring Initializr)

    在resources/application.properties中添加如下,开启DEBUG功能: 然后启动springboot应用,就可以看到DEBUG的日志。Positive表示生效,Negative表示不生效。如下所示: 下载百度的logo到resouces目录下,然后在resources/application.properties添加如下内容: 最后启动springboot应用。打印的日志如下,

    2024年02月15日
    浏览(43)
  • IDEA 解决 java: 找不到符号 符号: 类 __ (使用了lombok的注解)

    原因IDEA版本太高,在 ProcessingEnvironement 预编译的时候是以代理的方式来执行的,不再是直接 javac方式,  lombok依赖的 javac方式的 annotation processors 不再生效了 解决办法:下面这一句,加在下图中 -Djps.track.ap.dependencies=false 收工

    2024年04月10日
    浏览(48)
  • Java---使用lombok简化实体类的编写----不要再写getter+sertter方法了

    目录 使用lombok简化实体类的编写 首先: 加入lombok依赖: 然后 加上一个注解:@Data    删除原来实体类中的方法 加上一个注解:@Data    注意:@Data(包含了:@Setter @Getter @ToString @EqualsAndHashCode)但是 不包含构造方法的注解可以手动加上: @NoArgsConstructor @AllArgsConstructor

    2024年02月14日
    浏览(42)
  • 开发小程序使用 vant 遇到的坑 vant popup

    目录 vant popup vant Popover   小程序中H5页面使用van-uploader上传图片安卓手机调取相机失效问题 小程序上的vant用的是跟网页版的不一样的方法,网页版的可以使用v-model,但是小程序的要用\\\"show\\\"属性来控制显示与否。   由于是用show属性来控制,所以需要写一个close方法,这样一

    2024年02月13日
    浏览(50)
  • JavaWeb小项目——【源码】使用Vue+axios+Servlet+Lombok+JDBC+MySQL技术栈实现云笔记管理系统案例的开发

    使用Vue+axios+Servlet+Lombok+JDBC+MySQL技术栈实现云笔记管理系统案例的开发 (一)题目要求 使用Vue+axios+Servlet+Lombok+JDBC+MySQL技术栈实现云笔记管理系统案例的开发 (二)数据库设计(10分) 创建数据库woniu_note (1)用户表:t_user,必要字段包含:用户名(username)、密码(passwd)

    2024年02月09日
    浏览(38)
  • 使用Python编程语言处理数据 (Processing data using Python programm

    作者:禅与计算机程序设计艺术 Python作为一种高级、开源、跨平台的编程语言,已经成为当今最流行的数据分析和机器学习工具。本文介绍了使用Python编程语言处理数据的一些基础知识,如列表、字典、集合、迭代器等,并对pandas、numpy、matplotlib、seaborn等数据分析库进行了

    2024年02月07日
    浏览(48)
  • Mybatis学习|注解开发、lombok

    无需再编写相应的Mapper.xml文件,直接将sql用注解的形式写在Mapper接口的对应方法上即可。 然后因为没有xml文件,所以要在mybatis-config.xml核心配置文件中注册这个Mapper接口,而不用去注册之前的Mapper.xml,这里其实如果用xml的话用这种注册方法也是可以的(确保接口名字和xml的名

    2024年02月10日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包