一、前言
在 Java 中,最常见的封装莫过于 get、set 方法了,无论是 Intellij idea 还是 Eclipse,都提供了快速生成 get、set 方法的快捷键,使用起来很是方便,但其实,我们还有更方便的办法,就是今天的主角:Lombok
1、Lombok 是什么?
Lombok 是一个通过注解以达到减少代码的Java库,如通过注解的方式减少 get、set,构造方法等。
2、如何安装Lombok?
在 Lombok 官网中,有一个 install 选项,我们点开它会看到多种安装方式:
以 maven 为例,在自己的项目里添加 lombok 的编译支持,在 pom 文件里面添加 dependency
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> <scope>provided</scope> </dependency>
lombok 不断更新,详情查看:lombok 中央库(https://mvnrepository.com/artifact/org.projectlombok/lombok)
但无论是 Intelij idea,还是 Eclipse 默认情况下都是不能识别的,我们还要让 idea 识别起来,那就要安装相对应都插件支持了。
二、Intellij IDEA 安装配置 lombok
1、安装 lombok
打开 IDEA 的 Settings 面板,并选择 Plugins 选项,然后点击 “Browse repositories”
在输入框输入”lombok”,得到搜索结果,点击安装,然后安装提示重启 IDEA,安装成功;
2、配置注解处理器
同样我们在 Settings 设置页面,我们点击 Build,Execution,Deployment --> 选择 Compiler --> 选中 Annotation Processors,然后在右侧勾选 Enable annotation processing 即可。
三、Lombok 如何使用?
在实体类上引入相关的注解就行,如下示例:
import lombok.Data;
@Data
public class Student {
private String name;
private int age;
private String male;
private String studentNo;
}四、Lombok 有哪些注解?
@Data@Setter@Getter@Log@Log4j@Log4j2@AllArgsConstructor@NoArgsConstructor@EqualsAndHashCode@NonNull@ToString@RequiredArgsConstructor@Value@SneakyThrows@Synchronized@Cleanup
1、@Data
注解在 类 上;提供类所有属性的 get 和 set 方法,此外还提供了 equals、canEqual、hashCode、toString 方法。
2、@Setter
注解在 属性 上;为单个属性提供
set方法;注解在 类 上,为该类所有的属性提供
set方法;
两者都提供默认构造方法。
3、@Getter
功能同上面 @Setter 注解
4、@Log
注解在 类 上;为类提供一个 属性名为 log 的日志对象,提供默认构造方法。
5、@Log4j
注解在 类 上;为类提供一个 属性名为 log 的 log4j 日志对象,提供默认构造方法。
6、@Log4j2
功能同上面 @Log4j 注解,引入的包不同
7、@AllArgsConstructor
注解在 类 上;为类提供一个全参的构造方法,加了这个注解后,类中不提供默认构造方法了。
8、@NoArgsConstructor
注解在 类 上;为类提供一个无参的构造方法。
9、@EqualsAndHashCode
注解在 类 上, 可以生成 equals、canEqual、hashCode 方法。
10、@NonNull
注解在 属性 上,会自动在 getter、setter 上产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常,也会有一个默认的无参构造方法。
11、@ToString
这个注解用在 类 上,可以生成所有参数的 toString 方法,还会生成默认的构造方法。@ToString 有多个属性可以进一步设置:
callSuper:是否输出父类的toString方法,默认为falseincludeFieldNames:是否包含字段名称,默认为trueexclude:排除生成tostring的字段doNotUseGetters: = 是否直接访问字段,而不是在生成tostring方法时使用getter(如果可用),默认为false
12、@RequiredArgsConstructor
这个注解用在 类 上,使用类中所有带有 @NonNull 注解的或者带有 final 修饰的成员变量生成对应的构造方法。
13、@Value
这个注解用在 类 上,会生成含所有参数的构造方法,get 方法,此外还提供了 equals、hashCode、toString 方法。
14、@SneakyThrows
这个注解用在 方法 上,可以将方法中的代码用 try-catch 语句包裹起来,捕获异常并在 catch 中用Lombok.sneakyThrow(e) 把异常抛出,可以使用 @SneakyThrows(Exception.class) 的形式指定抛出哪种异常,也会生成默认的构造方法,可以指定多个异常类型。
15、@Synchronized
这个注解用在 类方法 或者 实例方法 上,效果和 synchronized 关键字相同,区别在于锁对象不同,对于类方法和实例方法,synchronized 关键字的锁对象分别是类的 class 对象和 this 对象,而 @Synchronized 的锁对象分别是 私有静态final 对象 lock 和 私有 final 对象 lock,当然,也可以自己指定锁对象,此外也提供默认的构造方法。
该注解自动添加到同步机制,有生成的代码并不是直接锁方法,而是锁代码块,作用范围是方法上
16、@Cleanup
这个注解用在 变量 前面,可以确保已分配的资源被释放,例如IO的连接关闭,默认是调用资源的 close() 方法,如果该资源有其它关闭方法,可使用 @Cleanup(“methodName”) 来指定要调用的方法,也会生成默认的构造方法。
当然从1.7开始jdk已经提供了try with resources的方式自动回收资源
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}扩展配置
扩展几个不常用的注解用法,了解一下就好,一般我们项目中也不会真的这么干。
1、@Accessors
注解在 属性 上;为单个属性生效;
注解在 类 上,为该类所有的属性生效;
chain:设置为true,生成的setter将返回 this(而不是void),通过这个配置我们可以像 jquery 一样愉快的链式编程了。默认为false。fluent:设置为true,生成的getter和setter将不会使用标准的get、is或set进行前缀,相反,方法将使用与字段相同的名称(减去前缀)。默认为false。prefix:给有前缀的属性字段,进行getter、setter过滤。
2、@FieldDefaults
设置缺省的字段修饰符。直接上代码吧!
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.experimental.FieldDefaults;
import lombok.experimental.NonFinal;
import lombok.experimental.PackagePrivate;
@AllArgsConstructor
@FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE)
public class FieldDefaultsExample {
public final int a;
int b;
@NonFinal int c;
@PackagePrivate int d;
}缺省为 private final。如果不想使用缺省值,可显式标注,或使用 NonFinal 取消 final。
编译后如下:
public class FieldDefaultsExample {
public final int a; // 明确定义的,不受影响
private final int b; // 未明确定义的,使用注解的private final
private int c; // 指定了NonFinal则只保留private
final int d; // 执行了PackagePrivate,表示使用包私有,即default可见修饰符,只保留final
public FieldDefaultsExample(int a, int b, int c, int d) {
super();
this.a = a;
this.b = b;
this.c = c;
this.d = d;
}
}3、@Delegate
代理方法。上代码
import lombok.experimental.Delegate;
import java.util.ArrayList;
import java.util.Collection;
public class User {
private interface SimpleCollection {
boolean add(String item);
boolean remove(Object item);
}
@Delegate(types = SimpleCollection.class)
private Collection<String> collection = new ArrayList<>();
public static void main(String[] args) {
User user = new User();
user.add("item1"); // 实际上加到collection中了
user.add("item2");
System.out.println(user.collection); // [item1, item2]
}
}编译后如下:
import java.util.ArrayList;
import java.util.Collection;
public class User {
private Collection<String> collection = new ArrayList();
public User() {
}
public static void main(String[] args) {
User user = new User();
user.add("item1");
user.add("item2");
System.out.println(user.collection);
}
public boolean add(final String item) {
return this.collection.add(item);
}
public boolean remove(final Object item) {
return this.collection.remove(item);
}
private interface SimpleCollection {
boolean add(String item);
boolean remove(Object item);
}
}此外还有
@ExtensionMethod@Wither@UtilityClass@Helper
总结
以上注解可根据需要一起搭配使用!
虽说轮子好,但是我们不仅要知其然,也要知其所以然!
相关文章
未经允许请勿转载:程序喵 » Lombok 介绍及详细使用方法示例
程序喵