关于使用Lombok的注意事项

文章目录

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

解决方案:增加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
关于使用Lombok的注意事项_第1张图片

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

3、关于使用Lombok的总结

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

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

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

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

你可能感兴趣的:(java,spring,junit)