• 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    用了@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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    细心的读者发了一个问题,为什么@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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

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

    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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

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

    1.请注意下面这个pojo类

    @Data
    @Accessors(chain = true)
    public class TestUser {
        private Long id;
        private String aName;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.来个controller

    @RestController
    @RequestMapping("/user")
    @RequiredArgsConstructor
    public class UserController {
    
        final UserService userService;
    
        @PostMapping("/testLombok")
        public void getTestLombok(@RequestBody TestUser testUser) {
            System.out.println(testUser);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    url:
    http://localhost:8080/user/testLombok
    body:
    {
        "id":1,
        "aName":"andy"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    4.控制台打印了什么?

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

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

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

    3.聊点废话

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

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

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

  • 相关阅读:
    Java远程操作Linux服务器命令
    ET-B32C如何让屏幕常亮(屏幕不熄灭或待机状态)
    测试工程师应具备的软实力
    数组和链表
    【牛客网刷题系列 之 Verilog快速入门】~ 使用函数实现数据大小端转换
    练习题57:接口的语法特征
    通过 360 反馈提高团队绩效
    vim常用命令记录
    [Vulnhub] CH4INRULZ_v1.0.1
    多维数组的【】和多级指针*转化推演
  • 原文地址:https://blog.csdn.net/weixin_44702984/article/details/134512546