Lombok主要作用是降低Java项目中的冗余代码,特别是Java bean中的Getter和Setter方法,当然也可以处理toString()、equals()和hashCode()方法,如果使用熟练,也可以单独定义每一个你觉得需要单独处理的属性。
一般情况下使用Lombox需要安装Lombok jar包,但是在Idea中只需要安装一个Lombok Plugin就可以,非常方便。
选择File—–>Settings——>Plugins,在搜索框中输入Lombok,搜索然后安装Lombok plugin,目前的版本是:0.15.17.2,等待安装完成之后重启Idea就可以了。
在maven项目中增加依赖:
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
当我们在编写一个bean的时候,正常先写属性,然后Getter和Setter,虽然idea可以自动生成,但是秉承能少则少能懒则懒的原则,我们使用注解:
@Getter
@Setter
使用这两个标签之后,代码里不会多Getter和Setter,但是查看代码结构,可以在structure中看到Getter和Setter,不用怀疑,build项目的时候,Getter和Setter一定会被正常的编译生成到jar包里。
所以能够看出来,使用lombok生成代码其实就是使用一个个的注解自动生成代码,介绍一下常用注解。
最基本的功能是自动生成getter方法,默认都是public级别的,如果想要定制,需要使用一个参数指定getter方法的属性:
@Getter(AccessLevel.PROTECTED) private int number;
一旦这样写了,number的getter方法将会变成protect级别的
参照Getter方法的使用方式
自动生成toString方法,也可以使用exculde参数排除不想被toString方法处理的参数。
@ToString(exclude="a")
public @Data class Test {
private String b;
private int c;
private String d;
}
如果这么写,那么参数a将不会胡现在toString方法的内部。
自动生成hashCode方法,参照toString的使用方式
自动生成equals方法,参照toString的使用方式
在方法的参数中添加@NonNull注解,在方法执行时将会自动检查参数是否为空,如果为空会抛出一个空指针异常。
public String getName(@NonNull Person p){
return p.getName();
}
在资源变量前面使用Cleanup参数,将会在方法结束后默认调用资源的close方法关闭资源,避免手动关闭。(注:这个地方与JAVA 7后提供的自动关闭有区别,JAVA 7的自动关闭其实并没有在代码执行完毕后立刻执行,所以有时候会出现删除资源占用的文件失败的问题,而Lombok则实际生成了close代码,只是隐藏起来,会正常的关闭资源)
@Cleanup InputStream in = new FileInputStream(filein);
@Cleanup OutputStream out = new FileOutputStream(fileout);
请自行脑补try—catch—finally结构代码块,太长不想写。
构造方法注解,第一个生成无参构造参数,第二个生成带有所有非空参数(@NonNull注解)或者final成员变量构造方法,第三个生成包含全部参数的构造方法。(注:如果成员变量有final修饰的话,不能使用@NoArgsConstructor)
这个注解包括了getter、setter、toString、hashcode、equals和RequiredArgsConstructor注解,生成以上注解生成的所有代码。
包括getter、toString、hashcode、equals和RequiredArgsConstructor注解,并且会把所有的成员变量认为是private final修饰的变量。
修饰一个方法,会把方法体内的代码用try-catch包起来,捕获的异常用Lombok.sneakyThrow(e)抛出来,可以指定异常:
@SneakyThrows(Exception.class)
跟synchronized关键字效果相同,但是锁对象不同,对于类方法和实例方法,synchronized关键字的锁对象分别是类的class对象和this对象,@Synchronized的锁对象是private static final对象和private final对象。可以指定锁对象:
private final Object lock = new Object();
@Synchronized("lock")
public void test() {
System.out.println("test");
}
便捷使用log的注解,我一般用@Slf4j。实际如下:
@CommonsLog
private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
@JBossLog
private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);
@Log
private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
@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);
一个想尽办法帮程序员偷懒的发明。