一、Lombok使用方法
Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量,并且这些setter、getter方法都不会变动,在实体类里面都差不多,基本每个属性都需要,而且一旦修改属性,就容易出现忘记修改对应方法的失误,如果我们使用Lombok简化Java代码,就可以解决这些问题。
Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。这样就省去了手动重建这些代码的麻烦,使代码看起来更简洁些。
Lombok的使用跟引用jar包一样,可以在官网(Download)下载jar包,也可以使用maven添加依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
接下来我们来分析Lombok中注解的具体用法。
二、 Lombok注解:
lombok 提供的注解不多,可以参考官方视频的讲解和官方文档。
Lombok 注解在线帮助文档:http://projectlombok.org/features/index.
Lombok 使用方法见:Java奇淫巧技之Lombok
三、Lombok常用注解
- @Data :注解在类上,相当于注解集合,提供类所有属性的 getting 和 setting 方法,这个注解等同于@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor这5个注解的集合,但是需要注意的是,这里不包括@NoArgsConstructor和@AllArgsConstructor
- @Setter:注解在属性上;为属性提供 setting 方法
- @Getter:注解在属性上;为属性提供 getting 方法
- @Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
- @NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
- @AllArgsConstructor:注解在类上;为类提供一个全参的构造方法
- @NonNull:该注解用在属性或构造器上,Lombok会生成一个非空的声明,可用于校验参数,能帮助避免空指针。 如果该参数为null 会throw new NullPointerException(参数名);
- @Cleanup:注释在引用变量前:自动回收资源 默认调用close方法
@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);
- @Builder:注解在类上;为类提供一个内部的Builder
- @EqualsAndHashCode: 默认情况下,会使用所有非静态(non-static)和非瞬态(non-transient)属性来生成equals和hasCode,也能通过exclude注解来排除一些属性。
- @ToString : 注解在类上, 为类提供 toString() 方法
四、使用示例
1. 没使用Lombok写法
public class Person {
private String id;
private String name;
private String identity;
private Logger log = Logger.getLogger(Person.class);
public Person() {
}
public Person(String id, String name, String identity) {
this.id = id;
this.name = name;
this.identity = identity;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public String getIdentity() {
return identity;
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setIdentity(String identity) {
this.identity = identity;
}
}
2. 使用Lombok的写法
@Data
@Log4j
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private String id;
private String name;
private String identity;
}
参考: Reducing Boilerplate Code with Project Lombok | Object Computing, Inc.
3. Lombok的注解大全
Annotation Type | Description |
AllArgsConstructor | 生成一个全参数构造函数 |
AllArgsConstructor.AnyAnnotation | 弃用 |
不要使用这个注解,永远-阅读文档。 | |
Builder | 构建器注解为被注解的类或包含带有@Builder注解的成员的类创建一个所谓的“builder”方面。 |
Builder.Default | 用@Default注释的字段必须有一个初始化表达式;如果在构建过程中没有显式设置,则将该表达式作为默认使用。 |
Builder.ObtainVia | 在一个字段(在类型上使用@Builder)或一个参数(在构造函数或静态方法上使用@Builder)上设置,以指示lombok如何在给定实例的情况下获取该字段或参数的值;这是唯一相关的,如果toBuilder是真实的。 |
Cleanup | 确保通过调用其close方法清除您注解的变量声明,无论发生什么。 |
CustomLog | 使lombok根据自定义记录器实现生成记录器字段。 |
Data | 为所有字段生成getter,一个有用的toString方法,hashCode和equals实现检查所有非瞬态字段。 |
Delegate | 弃用 |
使用委托。 | |
EqualsAndHashCode | 基于相关字段为所有对象继承的equals和hashCode方法生成实现。 |
EqualsAndHashCode.AnyAnnotation | 弃用 |
不要使用这个注解,永远-阅读文档。 | |
EqualsAndHashCode.Exclude | 如果存在,则不要在生成的equals和hashCode方法中包含此字段。 |
EqualsAndHashCode.Include | 在equals和hashCode实现中配置如何处理该成员的行为;如果在一个方法上,将该方法的返回值作为计算hashCode/相等性的一部分。 |
Generated | Lombok最终将自动将此注解添加到所有生成的构造函数、方法、字段和类型中。 |
Getter | 将其放在任何字段上,使lombok构建一个标准getter。 |
Getter.AnyAnnotation | 弃用 |
不要使用这个注解,永远-阅读文档。 | |
NoArgsConstructor | 生成一个无参数构造函数。 |
NoArgsConstructor.AnyAnnotation | 弃用 |
不要使用这个注解,永远-阅读文档。 | |
NonNull | 如果使用参数,lombok将在方法/构造函数体的开头插入一个空检查,抛出一个带有参数名称的NullPointerException消息。 |
RequiredArgsConstructor | 生成带有必需参数的构造函数。 |
RequiredArgsConstructor.AnyAnnotation | 弃用 |
不要使用这个注解,永远-阅读文档。 | |
Setter | 将其放在任何字段上,使lombok构建成为一个标准setter。 |
Setter.AnyAnnotation | 弃用 |
不要使用这个注解,永远-阅读文档。 | |
Singular | 这个奇异的注释与@Builder一起用于在构建器中为集合创建单个元素“add”方法。 |
SneakyThrows | @SneakyThrow将避免javac坚持让您捕获或抛出方法体中声明生成的任何检查异常。 |
Synchronized | 几乎就像把'synchronized'关键字放在一个方法上,除了将同步在一个私有的内部对象上,这样其他代码不在你的控制下不会干涉你的线程管理通过锁定你自己的实例。 |
ToString | 为所有对象继承的toString方法生成一个实现,包括打印相关字段的值。 |
ToString.Exclude | 如果存在,则不要在生成的toString中包含此字段。 |
ToString.Include | 配置该成员如何在toString中呈现的行为;如果在一个方法上,在输出中包含该方法的返回值。 |
val | 使用val作为任何局部变量声明的类型(即使是在for-each语句中),类型将从初始化表达式中推断出来。 |
Value | 生成大量的代码,这些代码适合一个表示不可变实体的类。 |
var | 使用var作为任何局部变量声明的类型(即使在for语句中),类型将从初始化表达式中推断(对该变量的任何进一步赋值都不涉及此类型推断)。 |
With | 在任何字段上添加一个withX方法'with',它会生成该对象的一个克隆(除了一个字段会获得一个新值)。 |
With.AnyAnnotation | 弃用 |
不要使用这个注解,永远-阅读文档。 |