关于使用Lombok的注意事项

news2024/10/6 12:20:54

文章目录

        • 1、Lombok简介
        • 2、使用Lombok的问题
          • 2.1 驼峰问题
          • 2.2 相同的字符串不同的大小写
        • 3、关于使用Lombok的总结
        • 4、写在最后

1、Lombok简介

Lombok项目是一个Java库,它会自动插入您的编辑器和构建工具中,从而为你优化Java代码。通过注解的方式代替我们手动生成gettersettertoString等方法。

虽然现在的IDE可以帮我们自动生成,但是整个类显的很臃肿。尤其类的属性太多时,查看属性非常不方便。使用Lombok可以使我们的代码更加简洁,可以说是程序员的福音。

官网地址:https://projectlombok.org/

2、使用Lombok的问题

使用Lombok一时爽,但是需要一些问题之后,如果不了解细节,查找原因难上加难,这可能也是一些公司不建议使用Lombok的原因。下面总结了一下遇到的几个问题。

2.1 驼峰问题

先来看一下一个案例:

public class Book {
    private String uName;
}

先来看看IDE和JDK帮我们生成的gettersetter方法:

public class Book {

    private String uName;

    public String getuName() {
        return uName;
    }

    public void setuName(String uName) {
        this.uName = uName;
    }
}

生成gettersetter方法的语法是是这样的:getXxxx,setXxx
但是当遇到案例的属性,就会特殊处理成getxxxsetxxx

与之类似属性还有如下:

public class Book {

    private String uName;
    private String AName;
    private boolean isEmpty;
    private boolean iseasy;
    private boolean aBoolean;
    private boolean BBoolean;

    public String getuName() {
        return uName;
    }

    public void setuName(String uName) {
        this.uName = uName;
    }

    public String getAName() {
        return AName;
    }

    public void setAName(String AName) {
        this.AName = AName;
    }

    public boolean isEmpty() {
        return isEmpty;
    }

    public void setEmpty(boolean empty) {
        isEmpty = empty;
    }

    public boolean isIseasy() {
        return iseasy;
    }

    public void setIseasy(boolean iseasy) {
        this.iseasy = iseasy;
    }

    public boolean isaBoolean() {
        return aBoolean;
    }

    public void setaBoolean(boolean aBoolean) {
        this.aBoolean = aBoolean;
    }

    public boolean isBBoolean() {
        return BBoolean;
    }

    public void setBBoolean(boolean BBoolean) {
        this.BBoolean = BBoolean;
    }
}

小结:

  • String uName,ANamegettersetter会沿用类的属性即不会大小写的转化:getuNamesetAName
  • boolean isEmptygetter就是方法本身,setter方法会去除issetEmpty
  • boolean iseasygetter方法:isIseasy,settter方法为:setIseasy
  • boolean aBoolean,BBooleangetter方法均是isxxxx,setter方法均为setxxxx。其他boolean属性的getter方法均是isXxxsetter方法均为setXxx

再来看看Lombok为我们生成的方法:

public class Book {
    private String uName;
    private String AName;
    private boolean isEmpty;
    private boolean iseasy;
    private boolean aBoolean;
    private boolean BBoolean;

    public Book() {
    }

    public String getUName() {
        return this.uName;
    }

    public String getAName() {
        return this.AName;
    }

    public boolean isEmpty() {
        return this.isEmpty;
    }

    public boolean isIseasy() {
        return this.iseasy;
    }

    public boolean isABoolean() {
        return this.aBoolean;
    }

    public boolean isBBoolean() {
        return this.BBoolean;
    }

    public void setUName(final String uName) {
        this.uName = uName;
    }

    public void setAName(final String AName) {
        this.AName = AName;
    }

    public void setEmpty(final boolean isEmpty) {
        this.isEmpty = isEmpty;
    }

    public void setIseasy(final boolean iseasy) {
        this.iseasy = iseasy;
    }

    public void setABoolean(final boolean aBoolean) {
        this.aBoolean = aBoolean;
    }

    public void setBBoolean(final boolean BBoolean) {
        this.BBoolean = BBoolean;
    }
}

看看其中和上面IDE生成的不一致的字段:boolean aBooleanString uName
lombok会将我们的小写转化成大写。

这样造成的问题可能会导致调用set方法是赋值失效,因为我们数据通过反射调用setter方法赋值的时候,都会按照我们IDE的这种规则。

解决方案:增加lombk.config的配置

  • 在src/main/java下增加lombk.config的文件(注:不是resources下哦)
  • 文件内容增加配置信息:lombok.accessors.capitalization=beanspec
2.2 相同的字符串不同的大小写

先看一个案例:IDE生成

public class Book {

    private String uName;
    private String uname;
    private String unamE;

    public String getuName() {
        return uName;
    }

    public void setuName(String uName) {
        this.uName = uName;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUnamE() {
        return unamE;
    }

    public void setUnamE(String unamE) {
        this.unamE = unamE;
    }
}

再来看看lombok的生成:

public class Book {
    private String uName;
    private String uname;
    private String unamE;

    public String getUName() {
        return this.uName;
    }

    public void setUName(final String uName) {
        this.uName = uName;
    }
}

lombok会这把这三个属性识别成一个属性。这种lombok不提供解决方案,作者认为这是不规范的操作。官方icuess如下:

https://github.com/projectlombok/lombok/issues/2130
在这里插入图片描述

大意如下:这种修改维护的成本比较高,也会带来额外的开销。该项目只有几个贡献者和2个维护者。这种情况也并不常见,不知道花费大量的时间取支持。

3、关于使用Lombok的总结

因为种种原因有人抵触它,有人喜欢它,这就仁者见仁智者见智了。
撇开Lombok的问题,我们首先需要做的就是规范自己的编码风格,尽量不要使用类似、相近单词命名。这样也会为我们自己阅读代码带来了障碍。

所以良好的代码规范会为我们带来很多好处,无论使用什么样的工具或者类库。对于一些特别的字段处理上很有可能会出现不一致的地方,只要我们规范了代码,使用那种工具都不会带来显而易见的异常。大家可以根据自己的习惯或者团队的习惯合理的选择三方库

4、写在最后

本文只分享的遇到的两个问题,如果遇到其他问题可以是在issues中寻找,查看解决方案。
关于lombok的使用,需要的朋友可以参考这篇博文
https://blog.vicat.top/archives/%E7%94%A8lombok%E8%AE%A9java%E6%9B%B4%E7%AE%80%E6%B4%81#%E4%B8%80-%E6%A6%82%E8%BF%B0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/510017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

注入攻击(二)--------HTML(有源码)

前序文章 注入攻击(一)--------SQL注入(结合BUUCTF sqli-labs) 目录 示例网站搭建1.搭建LAMP开发环境1. MySQL2. PHP3. Apache 写在示例前示例1.反射型HTML注入页面效果源码 示例2.钓鱼表单页面效果源码 示例3.存储型HTML注入页面效果源码 示例网站搭建 …

【Docker】使用 Docker 部署 Maven 仓库

在本文中,将介绍如何使用 Docker 部署一个 Maven 本地私服。Maven 私服可以帮助我们管理和共享本地的 Maven 依赖,提高开发效率。本文将使用 Sonatype Nexus 作为 Maven 私服,并使用 Docker Compose 来部署和管理容器。 准备工作 在开始之前…

mysql数据库在windows服务器下安装

一、mysql安装包下载 官网下载地址:mysql安装包下载 如图所示: 二、配置my.ini文件 解压后的文件尽量不要放在C盘(内存小),解压后如下图所示 在上图所示根目录下配置my.ini文件 1、右键创建一个文本(.text…

pikachu靶场-Unsafe Upfileupload

文件上传漏洞简述 什么是文件上传漏洞?  ​ 凡是存在文件上传的地方均有可能存在文件上传漏洞,关于上传文件操作的时候对方代码写的是否完整、是否安全,一旦疏忽了某个地方可能会造成文件上传漏洞。 文件上传的原理 网站Web应用都有一些文件…

1.SpringBoot基础篇

SpringBoot 文档更新日志 版本更新日期操作描述v1.02021/11/14A基础篇 前言 ​ 很荣幸有机会能以这样的形式和互联网上的各位小伙伴一起学习交流技术课程,这次给大家带来的是Spring家族中比较重要的一门技术课程——SpringBoot。一句话介绍这个技术,…

华为pbr双出口外线,指定内网单个vlan绑定单个出口外线上网

公司两条外线,vlan 10用nat走上面转发出去上网,vlan 20 走下面那条外线出去nat上网 AR2: interface GigabitEthernet0/0/0 ip address 6.6.6.1 255.255.255.0 interface GigabitEthernet0/0/1 ip address 154.1.2.3 255.255.255.0 interface…

Python+Selenium4环境搭建

set集合 怎么把列表种相同的数据和不同的数据取出来 1.把列表转为set集合 2.按照集合的交集 selenium 自动化测试:自动化测试就是通过代码或者是工具模拟人的行为来进行对WEB(APP)来进行操作。 QTP (HP公司):以录制回放的模式…

集7大模态(视频、图片、音频、文本、深度图、热力图、惯性)的IMAGEBIND

论文:IMAGEBIND: One Embedding Space To Bind Them All GitHub:https://github.com/facebookresearch/ImageBind Meta AI 提出了 ImageBind,它通过利用多种类型的图像配对数据来学习单个共享表示空间。该研究不需要所有模态相互同时出现的数…

《Kubernetes证书篇:基于cfssl工具集一键生成二进制kubernetes集群相关证书(方法一)》

一、背景信息 Kubernetes 需要 PKI 证书才能进行基于 TLS 的身份验证。如果你是使用 kubeadm 安装的 Kubernetes, 则会自动生成集群所需的证书。如果你是使用二进制安装的 Kubernetes,则需要自己手动生成集群所需的证书。 1、首先从etcd算起 1、etcd CA…

百度地图绘制地区的棱柱效果-定位-自定义点-文本标记-信息弹窗

文章目录 百度地图webgl使用自定义地图样式地区镂面棱柱效果绘制点信息以及信息弹窗 百度地图webgl使用 在项目的index.html中引入 <script type"text/javascript" src"//api.map.baidu.com/api?typewebgl&v1.0&ak你的AK秘钥"></script…

花式反转字符串

文章目录 简单反转字符串题目详情分析Java完整代码 反转链表进阶问题题目详情分析Java完整代码 左旋转字符串题目详情分析Java完整代码 反转字符串中的单词题目详情分析Java完整代码 本文对常见的反转字符串题目进行串烧整理。 简单反转字符串 题目详情 编写一个函数&#xf…

9. 对象指针与对象数组

一、对象指针 声明形式&#xff1a; 类名 *对象指针名; Clock c(8, 3, 10); Clock *ptr; ptr &c;通过指针访问对象成员&#xff08;一般类的属性都是封装起来的&#xff0c;因此通常是通过指针访问成员函数&#xff09; 对象指针名->成员名 ptr->getHour();相当于(*…

linux0.12-8-7-signal.c

[334页] (-:这一小节很难理解。但我基本都理解了&#xff0c;哈哈。 1、为什么signal不可靠&#xff0c;而sigaction可靠&#xff1b; 2、 为什么系统调用会被打断&#xff1f; 3、 sys_signal&#xff0c;sys_sigaction&#xff0c;函数作用&#xff1f; 4、 do_signal&#x…

【高项】高级项目管理与组织管理(第4版教材第20-23章,管理科学知识)

文章目录 【高项系列】知识复习1、高级项目管理&#xff08;组织级管理&#xff0c;项目集管理&#xff0c;项目组合管理&#xff0c;量化项目管理&#xff0c;项目成熟度模型&#xff09;1.1 组织级项目管理&#xff08;项目组合项目集, 战略方向一致&#xff0c;0-1分&#x…

python并发编程:并发编程中是选择多线程呢?还是多进程呢?还是多协程呢?

❝ Python对并发编程的支持非常丰富&#xff0c;可以使用多线程、多进程、协程等方式进行并发编程。那么&#xff0c;应该如何选择呢&#xff1f; ❞ Python并发编程有哪些方式 Python并发编程有三种方式: 多线程 Thread 多进程 Process 多协程 Coroutine 什么是CPU密集型计算、…

《花雕学AI》Poe 一站式 AI 工具箱:ChatGPT4 体验邀请,亲,不要错过哦!

你有没有想过&#xff0c;如果你能在同一个平台上体验多种不同的 AI 模型&#xff0c;和他们进行有趣、有用、有深度的对话&#xff0c;甚至还能轻松地分享你的对话给其他人&#xff0c;那该有多好&#xff1f;如果你有这样的想法&#xff0c;那么你一定不能错过 Poe 一站式 AI…

winsows10 下 wsl2 使用 rviz 报错 Segmentation fault 段错误 (核心已转储) 的另一可能解决方案

问题 今天在 wsl 里使用 rviz 时突然报错 Segmentation fault 无法使用了, 报错如下 (base) rootXAIR14:~ $ rviz QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to /tmp/runtime-root [ INFO] [1683702959.671174856]: rviz version 1.13.29 [ INFO] [1683702959.67…

SpringMVC中使用form:form表单标签报500错误

在做数据验证的时候出现了一点bug,先看一下网页报错信息 再看一下后台日志信息 11: 12: <body> 13: 14: <form:form modelAttribute"user" action"/user/login" method"post"> 15: <table> 16: <tr> 17:…

Babel 总结

文章目录 Babel 总结概述安装使用一、添加配置文件二、编写源代码三、配置package.json四、编译代码 对比代码 Babel 总结 概述 Babel 是一个 JavaScript 编译器&#xff0c;主要用于在当前和旧的浏览器或环境中&#xff0c;将 ECMAScript 2015 代码转换为 JavaScript 向后兼…

【软考备战·希赛网每日一练】2023年5月10日

文章目录 一、今日成绩二、错题总结第一题第二题第三题 三、知识查缺 题目及解析来源&#xff1a;2023年05月10日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; proceed v.开始行动&#xff0c;开展&#xff1b;继续做&#xff08;或从事、进行&…