1、什么是Lombok?
Lombok是一个可以通过简单的注解形式(如@Data、@Getter等)来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。
大致意思是Lombok通过增加一些“处理程序”,可以让java变得简洁、快速。
2.Lombok能做什么?
Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。这样就省去了手动重建这些代码的麻烦,使代码看起来更简洁些。
3.Lombok的使用场景
Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误。
4、Lombok实现原理
首先是项目的源代码文件,在经过编译处理以后,lombok会使用自己的抽象语法树去进行注解的匹配,如果在项目中的某一个类中使用了lombok中的注解,那么注解编译器就会自动去匹配项目中的注解对应到在lombok语法树中的注解文件,并经过自动编译匹配来生成对应类中的getter或者setter方法,达到简化代码的目的。执行顺序就如上图的叠放顺序。
5、注解
val:用在局部变量前面,相当于将变量声明为final
@val:注解在属性上,如果注解了,就是设置为final类型,可查看源码的注释知道
@setter注解:在JavaBean或类JavaBean中使用,使用此注解会生成对应的setter方法;
@getter注解:在JavaBean或类JavaBean中使用,使用此注解会生成对应的getter方法;
@Getter/@Setter:用在属性上,再也不用自己手写setter和getter方法了,还可以指定访问范围
@ToString:用在类上,可以自动覆写toString方法,当然还可以加其他参数,例如
@ToString(exclude=”id”)排除id属性,或者@ToString(callSuper=true, includeFieldNames=true)调用父类的toString方法,包含所有属性
@EqualsAndHashCode:用在类上,自动生成equals方法和hashCode方法.
@Data:注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@NonNull:给方法参数增加这个注解会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出NPE(NullPointerException)
生成toString()方法,默认情况下,它会按顺序(以逗号分隔)打印你的类名称以及每个属性。
可以这样设置不包含哪些字段
@ToString(exclude = “id”)
或者:
@ToString(exclude = {“id”,“name”})
如果继承的有父类的话,可以设置callSuper 让其调用父类的toString()方法,如:
@ToString(callSuper = true)
生成toString方法如下:
@Data
@Data包含了@ToString、@EqualsAndHashCode、@Getter / @Setter和@RequiredArgsConstructor的功能。
@Data
public class DataExample {
private final String name;
@Setter(AccessLevel.PACKAGE)
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;
}
}
@NonNull: 作用在方法、构造方法的参数上,帮我们避免空指针
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
this.name = person.getName();
}
}
其他注解:
@Entity
@Table(name= Constants.TABLE_SCHOOL_DOWNLOAD_LIMIT)
@RequiredArgsConstructor(staticName = "of")
@Accessors(chain = true)
@ToString
public class SchoolDownloadLimit implements Serializable {
private static final long serialVersionUID = -196412797757026250L;
@Getter(onMethod = @_({@Id,@Column(name="id",nullable=false),@GeneratedValue(strategy= GenerationType.AUTO)}))
@Setter
private Integer id;
@Getter(onMethod = @_(@Column(name="school_id")))
@Setter
private Integer schoolId;
@Getter(onMethod = @_(@Column(name = "per_download_times")))
@Setter
private Integer perDownloadTimes;
@Getter(onMethod = @_(@Column(name = "limit_time")))
@Setter
private Integer limitTime;
@Getter(onMethod = @_(@Column(name = "download_to_limit_an_hour")))
@Setter
private Integer downloadToLimitInHour;
@Getter(onMethod = @_(@Column(name = "available")))
@Setter
private Integer available = 1;
@Getter(onMethod = @_(@Column(name = "create_time")))
@Setter
private Date createTime;
@Getter(onMethod = @_(@Column(name = "update_time")))
@Setter
private Date updateTime;
}
Lombok的目的是减少代码的重复编写,并提供比较好的解决方案。当然也存在一些争议性的注解,可以根据实际场景进项使用。Lombok有一些实验注解可以在官网查看。