官网上有 lombok 三分四十九秒的视频讲解,里面讲的也很清楚了,而且还有文档可以参考。
2. lombok 安装
使用 lombok 是需要安装的,如果不安装,IDE 则无法解析 lombok 注解。先在官网下载最新版本的 JAR 包
(1) 双击下载下来的 JAR 包安装 lombok
如果你想以这种方式安装,请参考官网的视频。
myeclipse.ini
(2) eclipse / myeclipse 手动安装 lombok
a. 将 lombok.jar 复制到 myeclipse.ini / eclipse.ini 所在的文件夹目录下
b. 打开 eclipse.ini / myeclipse.ini,在最后面插入以下两行并保存:
-Xbootclasspath/a:lombok.jar
-javaagent:lombok.jar
c.重启 eclipse / myeclipse
3. 引用jar包
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
</dependency>
4. 测试用例
package lombok;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j;
@Data
@Log4j
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private String id;
private String name;
private String identity;
}
编译,查看源代码
5. lombok 注解:
lombok 提供的注解不多,可以参考官方视频的讲解和官方文档。
Lombok 注解在线帮助文档:http://projectlombok.org/features/index.
下面介绍几个我常用的 lombok 注解:
@Data :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@Setter:注解在属性上;为属性提供 setting 方法
@Getter:注解在属性上;为属性提供 getting 方法
@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor:注解在类上;为类提供一个全参的构造方法
6. lombok使用
lombok
的使用主要是通过注解方式,官网文档lombok注解 有很详细的说明。
@NonNull
@NonNull
为方法或构造函数的参数生成null
检查语句,相当于if (param == null) throw new NullPointerException("param");
;生成的null
检查语句会插入到方法的最前端,如果是构造函数,则在this()
或super()
调用之后插入null
检查。
使用lombok
,我们可以这样写:
import lombok.NonNull;
public class User extends BaseEntity {
private String name;
private String password;
public User(@NonNull Person person) {
super("Hello");
this.name = person.getName();
this.password = person.getPassword();
}
}
而不使用lombok
则是这样写:
import lombok.NonNull;
public class User extends BaseEntity {
private String name;
private String password;
public User(@NonNull Person person) {
super("Hello");
if (person == null) {
throw new NullPointerException("person");
}
this.name = person.getName();
this.password = person.getPassword();
}
}
@Getter
/@Setter
使用@Getter
/@Setter
给字段注解,lombok
会自动生成默认的getter
/setter
方法,在Intellij IDEA的Structure
栏中可查看这个类的概要,就可以看到getter
和setter
方法已被添加到User
类中:
在未指定字段修饰符情况下,lombok
生成的getter
/setter
方法是public
的,若要修改其修饰符可设置AccessLevel
的值,如:
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
public class User {
private @Getter(AccessLevel.PRIVATE) @Setter String name;
private @Getter @Setter String password;
}
此时能看到User
类中的getName
方法的图标变成了一个锁,说明getName
方法已经是private
的,将不会被公开:
@ToString
使用@ToString
会生成toString()
方法,它会按顺序依次打印类名、字段;若想忽略输出字段,则可以用exclude
设置参数;如果有继承父类,可以设置callSuper
为true
让其调用父类toString()
方法:
@ToString(exclude = "password", callSuper = true)
public class User extends BaseEntity {
private @Getter @Setter String name;
private @Getter @Setter String password;
}
@EqualsAndHashCode
使用@EqualsAndHashCode
会生成hashCode()
和equals()
方法,默认会使用所有非静态、非transient
字段;
如果想排除某些字段可设置exclude
参数;
如果有继承父类,可以设置callSuper
为true
让其调用父类生成的equals()
和hashCode
方法,但是当没有继承父类并设置callSuper
为true
时会在编译时报错:
import lombok.*;
@EqualsAndHashCode(exclude = "password")
public class User {
private @Getter @Setter String name;
private @Getter @Setter String password;
@EqualsAndHashCode(callSuper = true)
public static class Department extends BaseEntity {
private @Getter @Setter String departmentName;
}
}
在Intellij IDEA的Structure栏中可查看到有equals()
和hashCode()
方法:
@NoArgsConstructor
, @RequiredArgsConstructor
, @AllArgsConstructor
@NoArgsConstructor
生成一个无参数构造函数:
@RequiredArgsConstructor
生成构造函数;如果带有参数,则该参数必须是以final
修饰并未初始化的字段或@NonNull
注解的并未初始化的字段,参数的顺序和字段在类中的声明顺序一致。
以@NonNull
注解并未初始化的:
以final
修饰并未初始化的:
正确和错误示例:
@AllArgsConstructor
生成全参数构造函数,将类中的每个字段生成带有1个参数的构造函数,例如有3个字段,则构造函数的参数为3个:
@Data
@Data
包含了@ToString
, @EqualsAndHashCode
, @Getter
, @Setter
, @RequiredArgsConstructor
的功能:
@Builder
@Builder
为类、构造器、方法上生成复杂的构建器API;构造实例时,其属性不再需要单独set
,可以通过以下方式进行实例化:Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();
其他注解
val
、@Cleanup
、@SneakyThrows
、@Synchronized
、@Getter(lazy=true)
、@Log
、experimental
等就不再做介绍,用法和说明可查看官网文档https://projectlombok.org/features/all。
https://www.lwhweb.com/2017/11/08/lombok-use/