java每日一记 —— 浅浅的说下在Lombok中遇到的一个坑

本篇代码在jdk11中测试通过,Lombok版本使用的是1.18.20

昨天写注解时提到了一下Lombok,然而最近写毕业论文又因为Lombok踩过几次坑,所以今天来聊聊

1.先谈谈Lombok吧

1.以前博主特别喜欢用的几个注解:

  • @Data: 这是一个组合注解,懂的都懂
  • @NonNull:注解放在字段上,表示该字段不允许为空
  • @RequiredArgsConstructor:注解放在类上,会为所有final和非null字段生成一个构造器
  • @Builder:注解放在类上,可以和构建者模式一样使用
  • @Accessors(chain = true):注解放在类上,链式编程
  • @Slf4j:注解放在类上和日志配合使用,懂的都懂
  • @Log4j:注解放在类上和日志配合使用,懂的都懂
  • @Cleanup:注解放在开启IO流的代码上,用完后可以自动关闭流

2.来几个案例说下上面的注解

2.1.@Data注解的使用方式

@Data
public class TestUser {
    private Long Id;
    private String name;
}

用了@Data不需要写get/set/toString,这无疑是简化了代码量,提高了效率

2.2.@Builder注解的使用方式

// pojo类
@Data
@Builder
public class TestUser {
    private Long Id;
    private String name;
}
// 测试类
public class TestUserMain {
    public static void main(String[] args) {
        TestUser testUser = TestUser.builder().Id(1L).name("andy").build();
        System.out.println(testUser);
    }
}

2.3.@Accessors(chain = true)的使用

// pojo类
@Data
@Accessors(chain = true)
public class TestUser {
    private Long Id;
    private String name;
}
// 测试类
public class TestUserMain {
    public static void main(String[] args) {
        TestUser testUser = new TestUser().setId(1L).setName("andy");
        System.out.println(testUser);
    }
}

细心的读者发了一个问题,为什么@Accessors(chain = true)和@Builder没有同时使用呢?请看下面代码

2.4.@Builder+@Accessors(chain = true)的使用

// pojo类
@Data
@Accessors(chain = true)
@Builder
public class TestUser {
    private Long Id;
    private String name;

    @Tolerate
    public TestUser() {}
}

// 测试类
public class TestUserMain {
    public static void main(String[] args) {
        TestUser testUser1 = new TestUser().setId(1L).setName("andy");
        TestUser testUser2 = TestUser.builder().Id(2L).name("tom").build();
        System.out.println(testUser1);
        System.out.println(testUser2);
    }
}

有些读者要问,不加无参构造不行吗?答案是:不可以

2.5.@RequiredArgsConstructor

做过spring的读者都知道,注入的方式有@Resource和@Autowired。但是知道@RequiredArgsConstructor注入的读者应该很少

// 这里只展示如何调用,框架代码就省略了
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {

    final UserService userService;

    @GetMapping("/test")
    public String getTest() {
        return userService.testSave();
    }
}

2.来聊聊为什么有些公司不喜欢用Lombok

聊正事之前,博主想问问各位读者在公司开发中真的是严格遵守规范吗?博主是不能的,毕竟开发时间都不够,哪里来遵守规范这一说。

1.请注意下面这个pojo类

@Data
@Accessors(chain = true)
public class TestUser {
    private Long id;
    private String aName;
}

2.来个controller

@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {

    final UserService userService;

    @PostMapping("/testLombok")
    public void getTestLombok(@RequestBody TestUser testUser) {
        System.out.println(testUser);
    }
}

3.启动项目,并且用postman发送请求

url:
http://localhost:8080/user/testLombok
body:
{
    "id":1,
    "aName":"andy"
}

在这里插入图片描述

4.控制台打印了什么?

控制台打印:TestUser(id=1, aName=null)

5.来一个debug
在这里插入图片描述

6.翻了翻编译后的代码发现了问题所在
在这里插入图片描述
7.最后博主将Lombok去掉后,手动get/set/toString后成功
在这里插入图片描述

3.聊点废话

1.在博主看来Lombok确实是一个很好用的工具

2.任何框架都不是一个十全十美的,如果你选择了一个框架就要能忍受它对项目带来的缺陷

3.博主今天遇到的坑,我相信是因为博主的代码规范问题导致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值