一、前言
在 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
方法,默认为false
includeFieldNames
:是否包含字段名称,默认为true
exclude
:排除生成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 介绍及详细使用方法示例