前言
java开发者应该都有这样的一种经历,定义完JavaBean后,需要生成其对于的构造函数、getter、setter、equals、hashCode、toString等方法,虽然可以通过IDE去生成,但是还是会有修改变量名或类型后需要修改上面提到的方法、代码冗余等问题。
lombok就是为解决上面问题的工具,真是遗憾为啥现在才发现这个工具。下面就把学习的过程记录下。
lombok是干啥的?
Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。
- 避免人工做重复的劳动,即:避免每定义一个JavaBean就要生成对应的getter和setter等方法的操作;
- 避免代码冗余;getter和setter等方法不用在代码中显示;
lombok如何使用呢?
需要在IDE上安装lombok
这里只记录在idea上安装的操作,以后在eclipse上安装时,在补充。
在idea上安装lombok
打开IDEA的Setting –> 选择Plugins选项 –> 选择Browse repositories –> 搜索lombok –> 点击安装 –> 安装完成重启IDEA –> 安装成功
安装后需要重启idea才能生效。
需要在项目中添加lombok的jar文件
maven用户可以直接添加:(具体版本可查看maven仓库:http://mvnrepository.com/)
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
</dependency>
</dependencies>
lombok的注释
lombok的注释有:@Getter、@Setter、@NonNull、@ToString、@EqualsAndHashCode、@Data、@Cleanup、@Synchronized、@SneakyThrows、@Slf4j。下面我们就来一一介绍:
@Getter和@Setter
可注解到类或字段上,会为指定字段或类的所有字段生成对应的Getter和Setter方法,默认方法都public类型的,也可修改方法的访问级别。
注解字段
可看到各个字段根据对应的注释自动生成了对应的Getter和Setter方法,birthDay字段的Getter方法设置为了protected。
注解类
在类上设置则该类的所有的字段都可生成对应的Getter和Setter方法。
@NonNull
使用在字段或方法上,用于判断在使用字段时,若是该字段为null,则会抛出NullPointerException。
注解字段
情况1:注解字段后,该这段的setter方法(对getter方法没有影响),若是设置的值为null,则会抛出NullPointerException。
情况2:还能使用在方法的参数字段上,作用是在使用该方法时,会先检查被@NonNull的字段传递的值是否为null,若是就抛出NullPointerException。
@NoArgsConstructor&@RequiredArgsConstructor&@AllArgsConstructor
注释在类上,表示自动生成物参数的构造方法
@ToString
注释在类上,表示自动生成toString()方法;还能根据相关参数,实现其他功能,比如:打印父类的字段。
@EqualsAndHashCode
注释在类上,表示equals和hashCode方法。
@Data
若是需求挺多,那岂不是注解也胡很多吗?@Data可以解决这个问题。
注释在类上,相当于@ToString, @EqualsAndHashCode, @Getter and @Setter。
@Cleanup
该@Cleanup注释可以用来保证分配的资源被释放。当使用带注释的局部变量时@Cleanup,任何后续代码都包含在一个 try/finally块中,该块保证在当前作用域的末尾调用cleanup方法。默认情况下,@Cleanup 假设清理方法命名为“close”,与输入和输出流一样。但是,可以为注释的value参数提供不同的方法名称。只有不带参数的清理方法才能与此注释一起使用。
使用@Cleanup注释时还需要注意一点。如果清理方法抛出异常,它将抢占方法体中引发的任何异常。这可能导致问题的实际原因被掩盖,并且在选择使用Project Lombok的资源管理时应该考虑到这一点。此外,随着Java 7中的自动资源管理,这个特定的注释可能相对短暂。
Lombok注释代码:
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();
}
}
相当于:
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
使用注释实例方法@Synchronized将提示Lombok生成一个名为的私有锁定字段$lock,该方法将在执行之前锁定。类似地,以相同的方式注释静态方法将生成为$LOCK静态方法命名的私有静态对象 ,以相同的方式使用。可以通过为注释的value参数提供字段名称来指定不同的锁定对象。提供字段名称时,开发人员必须定义属性,因为Lombok不会生成它。
Lombok注释代码:
private DateFormat format = new SimpleDateFormat(“MM-dd-YYYY”);
@Synchronized
public String synchronizedFormat(Date date){
return format.format(date);
}
等效的Java源代码:
private final java.lang.Object $ lock = new java.lang.Object [0];
private DateFormat format = new SimpleDateFormat(“MM-dd-YYYY”);
public String synchronizedFormat(Date date){
synchronized($ lock){
return format.format(date);
}
}
@SneakyThrows
注释于方法上,用于隐藏式的Throws的Exception。
Lombok注释代码:
@SneakyThrows
public void testSneakyThrows(){
throw new IllegalAccessException();
}
等效于:
public void testSneakyThrows(){
try {
throw new IllegalAccessException();
} catch(java.lang.Throwable $ ex){
throw lombok.Lombok.sneakyThrow($ ex);
}
}
@Slf4j
注释在类上,避免每次在使用日志的时候,需要手动在该类中定义:
private final Logger logger = LoggerFactory.getLogger(XXX.class);