https://projectlombok.org/
pom配置引入
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency
同时,在Intellij IDE中添加lombok插件,如下图:
lombok中注解
- @GETTER和@SETTER:
用于给属性字段生成getter和setter方法
PS:对于boolean字段,比如primary,对应生成的getter方法会是isPrimary而不是getPrimary。 - @NonNull
如果一个field被标注了@NonNull注解,则生成的所在类的构造函数和该属性的set方法中,都会进行非空判断
@NonNull
String shopId;
//对应生成的java source code中可以看到
public class ActivityQueryForm {
@NonNull
String shopId;
String activityName;
ActivityQueryForm(@NonNull String shopId, String activityName) {
if (shopId == null) {
throw new NullPointerException("shopId is marked non-null but is null");
} else {
this.shopId = shopId;
this.activityName = activityName;
}
}
public void setShopId(@NonNull String shopId) {
if (shopId == null) {
throw new NullPointerException("shopId is marked non-null but is null");
} else {
this.shopId = shopId;
}
}
}
- @ToString
用于生成toString()方法。默认是会把非static的属性字段以key-value的方式输出。
当然也支持在类上标注如下,不输出field字段:
@ToString(includeFieldNames = false)
也可以设置某些字段不展示或只输出某些字段:
@ToString(includeFieldNames = false)
- @EqualsAndHashCode
生成*equals()和hashCode()*方法。
用法和@ToString注解有点类似:
@EqualsAndHashCode(callSuper=true,exclude= {"address","city","state","zip"})
- @Data
这个注解囊括了@ToString, @EqualsAndHashCode, @Getter and @Setter这四个注解的功能。
另外,会把final或者被标注了@NonNull的属性字段作为参数,生成对应的构造函数。
如果,在类上注解如下,则会使得生成的构造函数为private,同时提供一个public的静态工厂:
@Data(staticConstructor="of")
//java source code如下
private Company(final Person founder) {
this.founder = founder;
}
public static Company of(final Person founder) {
return new Company(founder);
}
- @Cleanup
被标注了@Cleanup的本地变量,其实是会被try catch,以确保该资源被释放:
public void testCleanUp() {
try {
@Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(new byte[] {'Y','e','s'});
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
//Java source code如下
public void testCleanUp() {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
baos.write(new byte[]{'Y', 'e', 's'});
System.out.println(baos.toString());
} finally {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
- @Synchronized
被注解的方法以如果是实体类方法,则以this作为锁对象;如果是个静态方法,则以类对象作为锁对象。 - @SneakyThrows
总结
Lombok可以通过一个注解消除很多重复代码,比如getter和setter。但是不是说这个插件就没有缺点了。有兴趣的可以去看看issue list