一、前言
上一篇文章(【JVM知识】插入式注解处理器实现java编程规范检测)总结了一下插入式注解,我们知道lombok插件是通过插入式注解处理器实现的,并且lombok插件在工作中用的比较多,所以再总结一下lombok常用注解
;
二、常用注解
@Getter/@Setter
@ToString
@EqualsAndHashCode
@NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor
@Data
@Value
@Builder
@Slf4j
@Accessors
@SneakyThrows
@Synchronized
@Cleanup
三、使用示例
1、使用@Getter/@Setter
来代替 getter 和 setter 方法使代码更简洁
@EqualsAndHashCode
注解通过of属性指定参与equals hashcode字段
@ToString
注解通过of属性 可以配置字段
@Getter
@Setter
@EqualsAndHashCode(of = {
"name","age"}) //指定参与equals hashcode字段
@ToString(of = {
"name","age"}) //toString 可以配置字段
private static class User01{
private String name;
private Integer age;
private Byte sex;
}
2、Lombok提供了一系列的关于构造器的注解,包括无参构造器和有参构造器。
@NoArgsConstructor
为实体类生成无参的构造器方法@AllArgsConstructor
为实体类生成除了static修饰的字段之外带有各参数的构造器方法。@RequiredArgsConstructor
为实体类生成指定字段的构造器方法,而这些字段需要被 final,或者 @NonNull 修饰。
@NoArgsConstructor(access = AccessLevel.PRIVATE) //无参构造函数
@AllArgsConstructor //全参构造函数
private static class User02{
private String name;
private Integer age;
private Byte sex;
}
3、@Value
所有的成员变量都是 final 的,没有 setter 方法,适合加在值不希望被改变的类上,像是某个类的值当创建后就不希望被更改,只希望读它而已
@Data
@Value
private static class User03{
private String name;
private Integer age;
private Byte sex;
}
4、@Builder
是一个非常强大的注解,提供了一种基于建造者模式的构建对象的 API。使用 @Builder
注解为给我们的实体类自动生成 builder() 方法,并且直接根据字段名称方法进行字段赋值,最后使用 build()
方法构建出一个实体对象。
@Builder
private static class User04{
private String name;
private Integer age;
@Singular("addDog")
private List<String> dogs;
public static void main(String[] args) {
User04 user04 = User04.builder().name("张三").age(18).addDog("大黄").addDog("二哈").build();
System.out.println(user04);
}
}
5、@SneakyThrows
等同于public void exceptionTest() throws Exception{}
@SneakyThrows
public void exceptionTest(){
Thread.sleep(1000);
}
6、@Synchronized
等同于public synchronized void concurrency(){}
![](/qrcode.jpg)
@Synchronized
public void concurrency(){
}
7、@Cleanup
可以关闭流
public void copyFile(String in,String out) throws Exception {
@Cleanup FileInputStream inputStream = new FileInputStream(in);
@Cleanup FileOutputStream outputStream = new FileOutputStream(out);
byte[] b = new byte[65536];
while(true){
int r = inputStream.read();
if(r == -1){
break;
}
outputStream.write(b,0,r);
}
}
8、@Accessors(fluent = true)
注解没有set和get方法,易读性不是很好
@Data
@Accessors(fluent = true) //没有set和get
private static class User05{
private String name;
private Integer age;
public static void main(String[] args) {
User05 user05 = new User05();
user05.age(16);
System.out.println(user05.age());
}
}
9、@Accessors(chain = true)
注解链式设置对象参数
@Data
@Accessors(chain = true)
private static class User06{
private String name;
private Integer age;
public static void main(String[] args) {
User06 user06 = new User06();
user06.setName("张三").setAge(16);
System.out.println(user06.toString());
}
}
10、@FieldNameConstants
作用于类,生成一个包含所有成员变量的内部类或者内部枚举,内部类中每个字段值即为字段名,并且内部类字段值不可变
属性说明:
value
:设置内部类或者枚举的访问控制符,默认为 public 共有
PUBLIC、MODULE、PROTECTED、PACKAGE、PRIVATE、NONE MODULE是 Java 9
的新特性,NONE 表示不生成 setter 方法,即停用注解功能asEnum
:是否为枚举类型,默认false
innerTypeName
:设置内部类或枚举名,默认值:“”,默认内部类名:FieldsonlyExplicitlyIncluded
:仅包含标记为 @FieldNameConstants.include的字段,默认为
falseInclude
:设置包含哪些字段Include
只有在 onlyExplicitlyIncluded = true 时才会生效,Include
标记在需要包含的属性或方法上 当 onlyExplicitlyIncluded = true 时,则必须搭配Include
使用,否则没有任何效果Exclude
:设置不包含哪些字段
@FieldNameConstants(innerTypeName = "刘能", asEnum = true, level = AccessLevel.PRIVATE, onlyExplicitlyIncluded = true)
public class ZhangTianAi {
@FieldNameConstants.Include
private String name;
@FieldNameConstants.Exclude
private Integer age;
public static void main(String[] args) {
System.out.println(刘能.name);
}
}