Lombok简介
Lombok
是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。
简单来说,我们平时开发过程中总是要花很多时间为Java Bean
去创建getter
和setter
方法,当类里面的属性很多时则创建的getter
和setter
就很多,代码就很长。而lombok
就可以为我们省去创建getter
和setter
方法的麻烦,代码也会更加简洁。
Lombok官方地址: https://projectlombok.org/
使用方法
一、安装插件
操作步骤:File
-> Settings...
-> Plugins
-> Browse repositories...
-> 输入Lombok
搜索并安装,安装完成后重启IntelliJ IDEA。
二、引用jar包
如果是使用Maven构建项目,则添加以下依赖:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
</dependencies>
否则直接下载jar包并引入到项目中,下载地址为:下载Lombok
三、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。
总结
使用lombok
能够为我们省去手动创建getter
和setter
方法的麻烦,lombok
有助于代码的整洁、效率的提高以及冗余的减少,但也同时降低了源代码文件的可读性和完整性。
不可过度依赖lombok。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。