lombok 的使用和简单原理分享
Lombok是一个Java库,能自动插入编辑器并构建工具,简化Java开发。通过添加注解的方式,不需要为类编写getter(), setter()
或eques()
方法,同时可以自动化日志变量。
1 如何使用
1.1. 添加maven依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
1.2 安装插件
使用Lombok 需要插件,idea中安装lombok插件
打开idea的设置,点击Plugins,点击Browse repositories,在弹出的窗口中搜索lombok,然后安装,
1.3
使用方法:
常用的lombok注解
@Data注解
/*
* @see Getter
* @see Setter
* @see RequiredArgsConstructor
* @see ToString
* @see EqualsAndHashCode
* @see lombok.Value
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
String staticConstructor() default "";
}
Data注解相当于 对类 加上了@toString 、 @EqualAndHashCode、 @Getter、 @Setter 和 @RequiredArgsConstructor
注释一样。@Data = @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor
@NonNull注解
Getter & @Setter 注解
生成的所有 getters/setters
默认都是public
的, 我们有时候需要屏蔽某个字段的访问级别
可以使用 AccessLevel枚举类
来设置字段的get/set级别。
public enum AccessLevel {
PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE,
/** Represents not generating anything or the complete lack of a method. */
NONE;
}
AccessLevel会覆盖Daat, GetSet等注解的public的级别
@NonNull注解
如果lombok为您生成整个方法或构造函数(例如@Data),Lombok总是将字段上通常称为@NonNull的各种注释视为生成空值检查的信号。但是,现在,在参数上使用lombok自己的@lombok.NonNull会导致在您自己的方法或构造函数中只插入null-check语句。
注解加载字段上, 就类似生成如下:
@NonNull
private String name;
public String getName() {
if (name == null) {
throw new NullPointerException();
}
return name;
}
@ToString
@ToString
注解用来替换掉生成 toString() 方法的实现,默认情况下,它会按顺序打印你的班级名称以及每个字段,并以逗号分隔。
想在toString()
方法不打印某个字段, 使用@ToString.Exclude
来排除指定字段不会被 toString()
打印
lombok也支持 打印字段的优先级, 比如不打印父类的字段,修改打印的字段的顺序等功能。。。。。
@EqualsAndHashCode
任何类的定义都可以用@EqualsAndHashCode 标注,让 lombok 为其生成 equals
和 hashCode
方法。默认情况下,将会用在非静态,非 transient 标记的字段上,但是你可以通过 @EqualsAndHashCode.Include
和@EqualsAndHashCode.Exclude
标记类型成员来修改使用哪些字段,,
@NoArgsConstructor@RequiredArgsConstructor@AllArgsConstructor
@Data
注解, 就包含的有@RequiredArgsConstructor注解,
那俩个都好理解,一个无参构造函数, 一个全参构造函数。
@RequiredArgsConstructor
是每个需要特殊处理的字段生成一个带有1个参数的构造函数。所有未初始化的 final 字段都会获取一个参数,以及标记为@NonNull
的任何字段也会获取一个参数。这些字段在声明它们的地方没有初始化。对于这些标记为 @NonNull
的字段,会生成特殊的null 编译检查。如果标记为 @NonNull
的字段的参数为 null
,那么构造函数将会抛出 NullPointerException
。
例如:
@Data
public class A {
@NonNull
private String name;
private int num;
}
这样的类, A a = new A();
编译无法通过, 因为RequiredArgsConstructor强制要求必须生成了带name的构造函数.