lombok的使用


 

IDEA需要安装 lombok 插件

 

依赖

创建springboot项目时勾选lombok,或者手动添加依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

 

lombok常用注解

生成实体类的常用方法
//生成getter、setter方法
@Getter
@Setter 

//生成指定的构造方法,可以指定访问权限,全参构造方法 形参表的参数顺序 和成员变量前后顺序一致
@NoArgsConstructor
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PRIVATE)


//重写toString()
@ToString

//重写hashCode()、equals()
@EqualsAndHashCode

//以上2个注解默认只打印、比较当前类中的成员,如果要打印、比较父类的成员,需要设置callSuper = true
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)


//相当于 @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor
@Data

lombok提供的hashCode()、equals()方法往往不符合需求,如果需要重写hashCode()、equals(),尽量自行重写。

 

日志
//给当前类生成一个静态的日志记录器实例,变量名log,常用的比如slf4j、log4j的
@Slf4j
@Log4j

 

建造者模式
//自动实现建造者模式,但只能build当前类的成员,不能build父类的成员
@Builder  

//如果要build从父类继承来的成员,子类、父类都换成 @SuperBuilder 即可
@SuperBuilder  


//写成多行便于调试,报错时明确是哪行、哪个方法的问题
User user = User.builder()
        .username("xxx")
        .tel("xxx")
        .address("xxx")
        .build();

 

@Builder、@SuperBuilder 实质是自动生成一个静态内部类Builder

public static class UserBuilder {
    private Integer id;
    private String name;
    private String tel;
    private String address;

    UserBuilder() {
    }

	//字段赋值操作实质是:先给字段赋值,再返回当前Builder实例
    public User.UserBuilder id(final Integer id) {
        this.id = id;
        return this;
    }

    public User.UserBuilder name(final String name) {
        this.name = name;
        return this;
    }

    public User.UserBuilder tel(final String tel) {
        this.tel = tel;
        return this;
    }

    public User.UserBuilder address(final String address) {
        this.address = address;
        return this;
    }

	//build()构建外部类实例实质是:调用外部类的构造方法,传入内部类的字段值创建实例
    public User build() {
        return new User(this.id, this.name, this.tel, this.address);
    }

    public String toString() {
        return "User.UserBuilder(id=" + this.id + ", name=" + this.name + ", tel=" + this.tel + ", address=" + this.address + ")";
    }
}

 

异常处理、关闭资源
//标注在变量上,自动关闭资源
@Cleanup

//标注在方法上,自动把方法体放在try中,捕获异常后直接原样抛出。对于非运行时异常,标注后不用在方法签名上使用throws声明可能抛出的异常,相当于绕过编译器 Unhandled exception 的检测
//可以指定要try、throw的异常类型,缺省时默认为 Throwable.class
@SneakyThrows({IOException.class, ClassNotFoundException.class})
@SneakyThrows


// @Cleanup、@SneakyThrows常常搭配使用,因为IO流、连接等资源关闭时,基本都会抛出异常,需要设置对应的异常处理
@SneakyThrows
public void test() {
    @Cleanup InputStream inputStream = new FileInputStream("xxx.txt");
    //....
}

@SneakyThrows是把整个方法体放到try中,对异常的处理是直接抛出,方法签名上不会用throws声明可能抛出的异常,调用这个方法的开发可能不会留意到这个方法会抛出异常,也就没对可能抛出的异常进行处理,因为IDEA没有报红、也能通过编译,导致运行时出现一堆没有捕获处理的异常。

虽然@SneakyThrows可以让代码变得简洁、清爽,但十分容易遗漏异常的捕获处理,慎用,尤其是公司内部自行封装的、要提供给多个模块|项目使用的基础类库,一律禁止使用@SneakyThrows。

 

静态成员变量的问题

@Getter、@Setter、@AllArgsConstructor、@ToString、@Data、@Builder、@SuperBuilder 都只会应用到实例成员变量,不会应用到静态成员变量。只生成实例成员的getter、setter方法;生成的全参构造方法、toString()、建造者都只包含实例成员变量,不包含静态成员变量。

如果实体类中没有实例成员变量,则不要加以下注解,否则通不过编译,常见于不带实例成员的请求实体中

@AllArgsConstructor
@NoArgsConstructor
@Builder

 

实体类属性的单字母驼峰问题

单字母驼峰:开头的单词是一个小写字母,严格来说不能算是单词,eg. iPhonePrice,虽然也是驼峰命名,但不符合java规范。使用jackson序列化带有单字母驼峰成员变量的对象时,会报错不能识别该字段。

使用lombok的@Getter、@Setter或@Data标注带有单字母驼峰成员变量的类时,生成的getter、setter方法会把开头的单字母作为单词处理,eg. getIPhonePrice()、setIPhonePrice()。序列化之前lombok会把单字母驼峰的成员变量名换成符合java规范的,即把开头的单字母、后一个单词修正为一个单词,eg. iPhonePrice => iphonePrice,让jackson能成功序列化带有单字母驼峰的对象。

lombok能纠正单字母驼峰的序列化问题,但也导致了controller返回的响应字段名与实体类中定义的字段名、swagger之类工具生成的接口文档的字段名不一致。

单字母驼峰不符合java规范,这是开发人员本身命名不规范的问题,不应该指望 lombok 纠正,应该让开发注意编码习惯。

 

使用建议

lombok使用方便,避免了编写大量的繁杂代码,代码看起来很简洁、干净,但lombok本身问题也很多,不熟悉的人使用很容易出问题;一人使用,全组都得跟着用。

慎用lombok。对于提供给多个模块、项目使用的基础类库,一律禁用lombok。使用lombok时,禁止使用@SneakyThrows注解。

Refactor -> Delombok 可以将lombok的注解替换成相应的java代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值