关于使用Lombok的注意事项

文章介绍了Lombok在优化Java代码中的作用,通过注解自动创建getter、setter等方法,简化代码。但同时也指出Lombok在处理驼峰命名和相同字符串不同大小写场景时可能出现的问题,如setter方法匹配错误。解决方案包括添加lombok.config配置和遵循更好的编码规范。文章提醒开发者,尽管Lombok有其便利性,但也需注意潜在问题并规范编码,以避免不必要的困扰。
摘要由CSDN通过智能技术生成

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的这种规则。

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

  • 在src/main/java下增加lombok.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的问题,我们首先需要做的就是规范自己的编码风格,尽量不要使用类似、相近单词命名。这样也会为我们自己阅读代码带来了障碍。

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

我们本地启动或者测试运行时可能会出现: java:找不到符号 符号:变量:log,这种的解决方案就是检查自己的IDE是否支持lombok,开启注解、下载插件、版本这几个要素。如果均是OK的,则只需要配置一行参数:-Djps.track.ap.dependencies=false
在这里插入图片描述

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

使用@Builder注解时,以下是一些注意事项: 1. 确保正确使用Lombok:@Builder 是Lombok库中的一个注解,因此您需要在项目中引入Lombok依赖并配置适当的插件。这样才能使@Builder 注解正常工作。 2. 确定类的构造方法:@Builder 注解会自动生成一个带有所有非静态字段的构造方法。如果您已手动定义了构造方法,则需要根据需要进行适当的调整。 3. 了解默认值:@Builder 注解为每个字段生成默认值。对于基本类型,将使用其默认值(例如,int 的默认值为 0)。对于引用类型,将使用 null 作为默认值。如果您需要指定其他默认值,可以使用 @Builder.Default 注解。 4. 使用链式调用:@Builder 注解生成的构造器会返回当前对象的副本,以便实现链式调用。这意味着您可以按照以下方式设置对象的字段值: YourClass.builder().field1(value1).field2(value2).build(); 5. 处理可选字段:如果某些字段是可选的,您可以将其定义为 Optional 类型或使用 @Builder.Default 注解设置默认值为 Optional.empty()。 6. 继承和扩展:@Builder 注解默认情况下不会继承到子类中。如果您希望子类也能使用 @Builder 注解,可以使用 @SuperBuilder 注解。 7. 私有构造方法:如果您希望限制类的实例化并只通过 @Builder 注解生成对象,则可以将构造方法设置为私有。 这些是使用@Builder注解时的一些注意事项,希望能对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值