Lombok

2020/03/09 10:49
阅读数 1.2K

 项目中引入Lombok 

首先在项目的 pom.xml中引入 Lombok依赖:

 
  1. <dependency>

  2. <groupId>org.projectlombok</groupId>

  3. <artifactId>lombok</artifactId>

  4. </dependency>

除此之外,还要在IDE中安装Lombok插件,并配置:

接下来进行代码实验。


 爽!get/set不用写了 

以前我们写一个 POJO对象时,比如定义一个课程 Course,需要自己手动写上每个字段的 get()set()方法,就像这样:

 
  1. public class Course {

  2.  

  3. private Long id; // 课程ID

  4.  

  5. private String name; // 课程名称

  6.  

  7. private Integer score; // 课程成绩

  8.  

  9. // 自己手写下面的 get/set 方法!

  10. public Long getId() {

  11. return id;

  12. }

  13.  

  14. public void setId(Long id) {

  15. this.id = id;

  16. }

  17.  

  18. public String getName() {

  19. return name;

  20. }

  21.  

  22. public void setName(String name) {

  23. this.name = name;

  24. }

  25.  

  26. public Integer getScore() {

  27. return score;

  28. }

  29.  

  30. public void setScore(Integer score) {

  31. this.score = score;

  32. }

  33. }

但是借助于Lombok,一切都变得优雅起来,代码篇幅省了一半

 
  1. public class Course {

  2.  

  3. @Getter

  4. @Setter

  5. private Long id; // 课程ID

  6.  

  7. @Getter

  8. @Setter

  9. private String name; // 课程名称

  10.  

  11. @Getter

  12. @Setter

  13. private Integer score; // 课程成绩

  14. }

两个注解:@Getter@Setter即可方便搞定。


 爽!new对象变得优雅了 

在没有用Lombok之前,我们假如想new一个对象,我们往往会这么做(以上面的 Course类为例):

 
  1. Course course = new Course(); // 首先new一个对象

  2.  

  3. // 然后逐步去装填对象的各个字段

  4. course.setId( 123l );

  5. course.setName( "高等数学" );

  6. course.setScore( 100 );

引进Lombok之后,我们只需要在 Course类上用上 @Builder注解:

 
  1. @Builder

  2. public class Course {

  3. private Long id; // 课程ID

  4. private String name; // 课程名称

  5. private Integer score; // 课程成绩

  6. }

Course类对象的创建即可使用 链式表达 的方式一行代码完成:

 
  1. // 对象可以链式构造,一句话完成 !

  2. Course course = Course.builder().id(123l).name("高等数学").score(100).build();

看到这里,如果你学过设计模式中的 “建造者模式” 的话,一定能猜到 @Builder注解就是一个典型的“建造者模式”的实现案例!

建造者模式的链式调用用起来实在是很爽!


 爽!构造函数不用写了 

一、全参构造器不用写了

当你在你的类上使用了Lombok的注解 AllArgsConstructor时:

 
  1. @AllArgsConstructor

  2. public class Course {

  3.  

  4. private Long id; // 课程ID

  5.  

  6. private String name; // 课程名称

  7.  

  8. private Integer score; // 课程成绩

  9. }

这时候你的类在编译后会自动生成一个无参构造函数,就像这样:

 
  1. public class Course {

  2.  

  3. private Long id; // 课程ID

  4.  

  5. private String name; // 课程名称

  6.  

  7. private Integer score; // 课程成绩

  8.  

  9. // Lombok自动会帮你生成一个全参构造器!!

  10. public Course( Long id, String name, Integer score ) {

  11. this.id = id;

  12. this.name = name;

  13. this.score = score;

  14. }

  15. }

二、无参数构造器也不用写了

当你在你的类上使用了Lombok的注解 NoArgsConstructor时:

 
  1. @NoArgsConstructor

  2. public class Course {

  3.  

  4. private Long id; // 课程ID

  5.  

  6. private String name; // 课程名称

  7.  

  8. private Integer score; // 课程成绩

  9. }

这时候你的类在编译后会自动生成一个无参构造函数,就像这样:

 
  1. public class Course {

  2.  

  3. private Long id; // 课程ID

  4.  

  5. private String name; // 课程名称

  6.  

  7. private Integer score; // 课程成绩

  8.  

  9. // Lombok自动会帮你生成一个无参构造器!!

  10. public Course() {

  11. }

  12.  

  13. }

三、部分参数构造器也不用写了

当你在你的类上使用了Lombok的注解 RequiredArgsConstructor时:

 
  1. @RequiredArgsConstructor

  2. public class Course {

  3.  

  4. private Long id; // 课程ID

  5.  

  6. private final String name; // 课程名称

  7.  

  8. private Integer score; // 课程成绩

  9.  

  10. }

这时候你的类在编译后会自动生成一个具备部分参数的构造函数,就像这样:

 
  1. public class Course {

  2.  

  3. private Long id; // 课程ID

  4.  

  5. private final String name; // 课程名称

  6.  

  7. private Integer score; // 课程成绩

  8.  

  9. // 因为name字段定义成final,所以Lombok自动会帮你生成一个部分参数的构造器!!

  10. public Course(String name) {

  11. this.name = name;

  12. }

  13. }

因为 name字段定义成 final,所以 Lombok自动会帮你生成一个部分参数的构造器!!


 爽!null判空不用写了 

Lombok的 @NonNull注解可以自动帮我们避免空指针判断。该注解作用在方法参数上,用于自动生成空值参数检查,比如:

 
  1. public static void output( String input ) {

  2. // 作为一个严谨且良心的Java开发工程师

  3. // 一般我们要手动对入参进行校验,就像下面这样 !

  4. if( input == null ) {

  5. System.out.println("该函数输入参数为空");

  6. }

  7. System.out.println( input );

  8. }

但是有了Lombok之后,事情就变得简单了,一个注解搞定:

 
  1. public static void output( @NonNull String input ) {

  2. // 原先这里对 input 的判空不用手动做了

  3. System.out.println( input );

  4. }


 爽!屁股不用擦了 

什么意思呢?

假如我们要读取一个 txt文本文件,一般会这样写代码:

 
  1. BufferedReader br = null;

  2. try {

  3. FileReader fileReader = new FileReader("呵呵.tet"); // 定义文件

  4. br = new BufferedReader( fileReader ); // 读取文件

  5. System.out.println( br.readLine() ); // 读取文件一行内容

  6. } catch (Exception e) {

  7. e.printStackTrace();

  8. } finally {

  9. try {

  10. br.close(); // 无论如何文件句柄在使用结束后得手动关闭!!

  11. } catch (IOException e) {

  12. e.printStackTrace();

  13. }

  14. }

注意,这个文件句柄在使用完成之后是一定要手动 close的,否则就有可能资源泄漏

有了Lombok之后,这种擦屁股活儿统统不用干了,一个 @Cleanup注解即可搞定

 
  1. @Cleanup BufferedReader br = null; // 一个 @Cleanup注解搞定!

  2. try {

  3. FileReader fileReader = new FileReader("呵呵.tet");

  4. br = new BufferedReader( fileReader );

  5. System.out.println( br.readLine() );

  6. } catch (Exception e) {

  7. e.printStackTrace();

  8. }


 爽!异常不用捕捉了 

比如我们打开一个 txt文本文件:

 
  1. public void openTxt( String filename ) {

  2. try {

  3. FileReader fileReader = new FileReader( filename );

  4. } catch (FileNotFoundException e) {

  5. e.printStackTrace();

  6. }

  7. }

这地方的 FileNotFoundException异常,要么显式地在函数级抛出,要么就像上面一样 try/catch内部消灭。

如果在编码时,不想处理这种繁杂的异常处理,你可以使用Lombok的 @SneakyThrows注解进行简化,比如上面的代码就可以简化为:

 
  1. @SneakyThrows

  2. public void openTxt( String filename ) {

  3. FileReader fileReader = new FileReader( filename );

  4. }

这样你编码时就无需处理异常了。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部