今天说下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.博主今天遇到的坑,我相信是因为博主的代码规范问题导致