注解说明
Lombok提供了很多注解用于生成Java代码,主要存放于experimental、extern、lombok包下。
官方文档
experimental
experimental翻译为试验性,顾名思义,当前包下的一些注解处于试用阶段,不推荐使用,这里只做简单介绍。
注解 | 使用说明 |
---|---|
@Accessors | 配置lombok如何生成和查找getter和setter,比如链式编程设置属性值 |
@Delegate | 可以对任何字段或无参数方法进行注释,@Delegate以使lombok生成将调用转发给该字段的委托方法(或调用该方法的结果) |
@ExtensionMethod | 可以创建包含了一堆的类public,static方法,它都以至少1个参数。这些方法将使用该@ExtensionMethod功能扩展第一个参数的类型,就像它们是实例方法一样。 |
@ FieldDefaults | 所述@FieldDefaults注释可以添加一个访问修饰符(public,private,或protected在带注释的类或枚举)到每个字段。它也可以添加final到带注释的类或枚举中的每个字段中。 |
@FieldNameConstants | 该@FieldNameConstants注释生成包含用于在你的类的每个字段1个恒定的内型; 字符串常量(标记为public static final,类型为的字段java.lang.String),或者根据需要为每个字段使用1值的枚举类型-编写@FieldNameConstants(asEnum = true)枚举变量。@FieldNameConstants对于各种编组和序列化框架很有用。除非您lombok.fieldNameConstants.uppercase = true在lombok.config文件中设置了该选项,否则常量字段(无论是枚举值还是字符串常量)的名称始终与字段,大小写以及所有名称完全相同。 |
@Helper | 该注释使您可以将方法放入方法中。 |
@NonFinal | 用于指示被注释实体不是为 final |
@PackagePrivate | package private访问级别 |
@StandardException | 放置任何扩展了某些{@code java.lang.Throwable}类型的类,以添加4个常见异常构造函数 |
@SuperBuilder | 该@SuperBuilder标注生产络合剂的API为你的类。与相比@Builder,@SuperBuilder还可与超类的字段一起使用。但是,它仅适用于类型。最重要的是,它要求所有超类也都具有@SuperBuilder注释。 |
@Tolerate | 任何方法或构造函数都可以用注释,@Tolerate并且lombok会像它不存在一样起作用。 |
@UtilityClass | 实用程序类无法实例化。通过用标记您的类@UtilityClass,lombok将自动生成一个引发异常的私有构造函数,将您添加的任何显式构造函数标记为错误,并标记该类final。如果该类是内部类,则该类也会被标记static。 |
@var | 该类型仍然完全从强制性初始化程序表达式派生,并且任何进一步的赋值(现在都是合法的)(因为该变量不再final)都没有考虑确定合适的类型。 |
@WithBy | 不变属性的二传手的第二个最佳选择是构造对象的副本,但为该字段添加一个新值。产生此克隆的方法正是@With产生的withFieldName(newValue)方法:一种产生克隆的方法,但关联字段的新值除外。 |
@ Wither | 放在任何字段上以使lombok生成“ wither”-一种withX方法,该方法会生成此对象的副本(除了1个字段会获得新值) |
extern
extern包中,主要是针对日志,将@Logclass的变体放在您的类上(适用于任何日志记录框架),然后可以直接使用log对象打印日志。
@Slf4j
public class TestService {
public void testValid(User user) {
log.info("lombok");
System.out.println("TestService");
}
}
注解 | 使用说明 |
---|---|
@CommonsLog | 生成private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class) |
@Flogger | private static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass(); |
@Jacksonized | 该@Jacksonized注释是一个附加注释的@Builder和@SuperBuilder。它会自动配置生成的生成器类,以供Jackson的反序列化使用。它只有在还存在a@Builder或a的上下文中出现时才起作用@SuperBuilder。否则会发出警告。 |
@Log | private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName()); |
@JBossLog | private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.cla |
@Log4j | private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class); |
@ Log4j2 | private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class); |
@Slf4j | private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class); |
@XSlf4j | private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class) |
lombok
lombok包下的注解为常用注解
注解 | 使用说明 |
---|---|
@AllArgsConstructor | 全参构造函数 |
@Builder | 生成构造者模式,方便对属性 set/get 操作 |
@Cleanup | 自动调用变量的 close 方法释放资源 |
@CustomLog | 使lombok生成基于自定义记录器实现的记录器字段 |
@Data | 提供类的get、set、equals、hashCode、canEqual、toString方法 |
@Delegate | 此处列出的任何类型(包括超类型)中的每个方法都不会被过时。注意:中的所有方法Object,以及canEqual(Object other)将永远不会被过时。 |
@EqualsAndHashCode | 提供对应的 equals 和 hashCode 方法 |
@Generated | Lombok最终将自动将此注释添加到所有生成的构造函数,方法,字段和类型中。对于所有代码样式和错误查找工具,您都可以将该注释的存在标记为“忽略它”。 |
@Getter | 提供 get 方法 |
@ NoArgsConstructor | 无参构造函数 |
@NonNull | 自动生成空值校验 |
@RequiredArgsConstructor | 必须参数构造函数 |
@Setter | 提供 set 方法 |
@Singular | 与@Builder在集合的生成器中创建单个元素的“ add”方法。 |
@SneakyThrows | 大胆地抛出以前没有人抛出过的检查异常! |
@Synchronized | 自动生成同步锁 |
@ToString | 提供 ToString 方法 |
@ val | 使用val任何局部变量声明的类型(甚至在换每个语句),和类型将从初始化表达来推断。 |
@Value | 生成大量代码,这些代码适合于表示不可变实体的类。 |
@var | 轻松的局部变量 |
@With | 放置任何字段以使lombok生成一个“ with”-一种withX方法,该方法会生成此对象的副本(除了1个字段会获得新值)。 |
常用注解案例
IDE添加了lombok插件后,创建项目,引入pom就可以开始使用了
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
创建一个实体类用于测试
public class Person {
private Integer personId;
private String name;
private Integer age;
private String num;
}
@ NoArgsConstructor
为类提供一个无参的构造方法。
当类中有 final 字段没有被初始化时,编译器会报错,此时可用 @NoArgsConstructor(force = true),然后就会为没有初始化的 final 字段设置默认值 0 / false / null。
对于具有约束的字段(例如 @NonNull 字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。
@NoArgsConstructor
public class Person {
private Integer personId;
private String name;
private Integer age;
private String num;
}
@RequiredArgsConstructor
注解在类上,会生成构造方法(可能带参数也可能不带参数)。
该注解还可以用 @RequiredArgsConstructor(staticName=“methodName”) 的形式生成一个指定名称的静态方法,返回一个调用相应的构造方法产生的对象。
@AllArgsConstructor
此注解会为实体类生成一个全参构造方法,还可以AccessLevel指定修饰符,默认public。
@AllArgsConstructor(access= AccessLevel.PUBLIC)
public class Person {
private Integer personId;
private String name;
private Integer age;
private String num;
}
Person person = new Person(111, "bbb", 17, "ccc");
编译后文件:
@Builder
构建者模式,创建一个构建者,通过builder().build()方法创建对象。
@Builder
@AllArgsConstructor(access= AccessLevel.PUBLIC)
public class Person
Person person1 = Person.builder().age(18).name("ww").personId(112).num("bbb").build();
@Cleanup
以使用@Cleanup注解确保代码执行路径退出当前作用于时清除制定资源。在该作用域的末尾将调用close()方法,并使用了try/finally代码块确认该方法一定执行。
@Cleanup InputStreamReader sr = new InputStreamReader(new FileInputStream(new File("E:\\github\\lombok-master\\README.md")));
int temp = 0;
while ((temp = sr.read()) != -1)
{
System.out.print((char)temp);
}
@Data
提供类的getter、setter、equals、hashCode、canEqual、toString方法
@Data
@Builder
@AllArgsConstructor(access= AccessLevel.PUBLIC)
public class Person {
private Integer personId;
private String name;
private Integer age;
private String num;
}
@EqualsAndHashCode
当其注解在类上,为该类提供 hashCode() 和 equals() 方法。
@EqualsAndHashCode
public class Person {
private Integer personId;
private String name;
private Integer age;
private String num;
}
@Generated
@Getter
自动生成getter方法,如果是用在类上:则为这个类所有属性供 setter 和 getter方法,如果用在属性上:则只为该属性提供 setter 和 getter 方法。
@Getter
@Builder
@AllArgsConstructor(access= AccessLevel.PUBLIC)
public class Person {
private Integer personId;
private String name;
private Integer age;
private String num;
}
@Setter
自动生成setter方法
@Getter
@Setter
@Builder
@AllArgsConstructor(access= AccessLevel.PUBLIC)
public class Person {
private Integer personId;
private String name;
private Integer age;
private String num;
}
@NonNull
注解在属性上,标识属性是不能为空,为空则抛出异常。换句话说就是进行空值检查。
public static void test(@NonNull String name) {
System.out.println();
}
@SneakyThrows
大胆抛出已检查的异常,比如之前打印文件的代码,方法中没有throws异常时,代码会爆红。
使用@SneakyThrows,可以将方法中的代码用 try-catch 语句包裹起来,捕获异常并在 catch 中用 Lombok.sneakyThrow(e) 把异常抛出。也可以使用 @SneakyThrows(Exception.class) 的形式指定抛出哪种异常。
@Synchronized
创建一个互斥锁,保证此时没有其它线程对锁代码块进行操作,保证线程的安全性。@Synchronized 的锁对象分别是“私有静态 final 对象 lock”和“私有 final 对象 lock”。当然,也可以自己指定锁对象。
@Synchronized
public static void syncCode() {
int i = 0;
i++;
System.out.println(i);
}
@ToString
@ToString
public class Person {
private Integer personId;
private String name;
private Integer age;
private String num;
}
Person person = new Person(111, "bbb", 17, "ccc");
System.out.println(person);
var和val
val、val 关键字可以让我们在定义一个变量时候不需要提前指定它的类型,它的实际的类型将由初始化的表达式推断。
var person = new Person(111, "bbb", 17, "ccc");
val person222 = new Person(111, "bbb", 17, "ccc");
@Value
@Value 注解和 @Data 类似,区别在于它会把所有成员变量默认定义为 private final 修饰,并且不会生成 set() 方法。
@Value
public class Person {
Integer personId;
String name;
Integer age;
String num;
}
@With
@With 可以使用在类上,也可以使用在成员变量上。加在类上相当于给所有成员变量 @With。
@With(AccessLevel.PUBLIC)
Integer personId;