Java֮Lombok

匿名 (未验证) 提交于 2019-12-02 21:52:03

1. Lombok背景介绍

官方介绍如下:

Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code.

大致意思是Lombok通过增加一些“处理程序”,可以让java变得简洁、快速。

2.Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误。
Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。这样就省去了手动重建这些代码的麻烦,使代码看起来更简洁些。
Lombok的使用跟引用jar包一样,可以在官网(https://projectlombok.org/download)下载jar包,也可以使用maven添加依赖:

<dependency>     <groupId>org.projectlombok</groupId>     <artifactId>lombok</artifactId>     <version>1.16.20</version>     <scope>provided</scope> </dependency>

接下来我们来分析Lombok中注解的具体用法。

2.1 @Data
@Data注解在类上,会为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。

import lombok.AccessLevel; import lombok.Setter; import lombok.Data; import lombok.ToString;   @Data  public class DataExample {   private final String name;   private int age;   private double score;   private String[] tags;      @ToString(includeFieldNames=true)   @Data(staticConstructor="of")   public static class Exercise<T> {     private final String name;     private final T value;   } }

2.2 @Getter/@Setter
如果觉得@Data太过残暴(因为@Data集合了@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructor的所有特性)不够精细,
可以使用@Getter/@Setter注解,此注解在属性上,可以为相应的属性自动生成Getter/Setter方法,也可以在类上,则自动对类属性生成getter方法和setter方法。

2.3 @NonNull
该注解用在属性或构造器上,Lombok会生成一个非空的声明,可用于校验参数,能帮助避免空指针。
示例如下:

import lombok.NonNull;   public class NonNullExample extends Something {   private String name;      public NonNullExample(@NonNull Person person) {     super("Hello");     this.name = person.getName();   } }

2.4 @ToString
类使用@ToString注解,Lombok会生成一个toString()方法,默认情况下,会输出类名、所有属性(会按照属性定义顺序),用逗号来分割。
通过将includeFieldNames参数设为true,就能明确的输出toString()属性。这一点是不是有点绕口,通过代码来看会更清晰些。
使用Lombok的示例:

import lombok.ToString;   @ToString(exclude="id") public class ToStringExample {   private static final int STATIC_VAR = 10;   private String name;   private Shape shape = new Square(5, 10);   private String[] tags;   private int id;      public String getName() {     return this.getName();   }      @ToString(callSuper=true, includeFieldNames=true)   public static class Square extends Shape {     private final int width, height;          public Square(int width, int height) {       this.width = width;       this.height = height;     }   } }

2.5 @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
无参构造器、部分参数构造器、全参构造器。Lombok没法实现多种参数构造器的重载。
Lombok示例代码如下

import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.AllArgsConstructor; import lombok.NonNull;   @RequiredArgsConstructor(staticName = "of") @AllArgsConstructor(access = AccessLevel.PROTECTED) public class ConstructorExample<T> {   private int x, y;   @NonNull private T description;      @NoArgsConstructor   public static class NoArgsExample {     @NonNull private String field;   } }

3. Lombok的优缺点
优点:
1. 能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
2. 让代码变得简洁,不用过多的去关注相应的方法
3. 属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等
缺点:
1. 不支持多种参数构造器的重载
2. 虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!