最近发现了一个非常好用的库,叫做Lombok,它可以帮助我们简化一些Java代码的编写。我试用了一下感觉非常好用,所以来介绍一下。
下面对Lombok的简单使用方法做一下总结:
- val 这不是一个注解,用于局部变量声明,减少重复输入。
- @NotNull 作用在方法参数上的注解,用于自动生成空值参数检查。
- @Cleanup 作用在局部变量上,在作用域结束时会自动调用close方法释放资源。
- @Getter 作用在字段上,会自动生成字段的Getter;作用在类上,会自动生成该类所有非静态字段的Getter,还能控制Getter的访问级别
- @Setter 基本同上。
- @ToString 类注解,自动生成类的toString方法,可以做一些定制,比如不使用某个字段,不调用Getters等。
- @EqualsAndHashCode 类注解,自动生成类中所有非静态非瞬时字段的equals方法和hashCode方法。
- @NoArgsConstructor 类注解,自动生成一个无参构造函数。
- @AllArgsConstructor 类注解,生成一个初始化所有字段的构造函数。
- @RequiredArgsConstructor 类注解,为final字段和标记了@NotNull的字段生成构造函数。
- @Data 类注解,相当于同时应用了@Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor。如果已经定义了一个构造方法,就不会再自动生成构造方法了。
- @Value 类注解,和@Data类似,但是用于不可变类型。生成的类和所有字段都设置为final,所有字段都为private,自动生成Getter但是没有Setter,会生成初始化所有字段的构造函数。相当于同时应用了final @ToString、 @EqualsAndHashCode、 @AllArgsConstructor 、@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)和 @Getter。
常用的还有一个一些Log注解,Lombok已经对常用的日志都做了工作。这里直接引用官网的介绍:
@CommonsLog
Creates private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
@JBossLog
Creates private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);
@Log
Creates private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4j
Creates private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
@Log4j2
Creates private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
@Slf4j
Creates private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
@XSlf4j
Creates private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
说了这么多,我们来看看一个例子:
package yitian.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private int id;
private String username;
private String password;
private String nickname;
private String address;
private LocalDate birthday;
}
可以看到,由于应用了@Data注解和两个构造方法注解,代码变得非常短小易读。即使使用IDE自动生成这些代码,一般也会生成超过100行的代码。可见Lombok的方便之处。
最后再来说说Lombok的原理吧。虽然Lombok也用到了注解,但是它并没有用到反射,而是通过一些奇技淫巧,在代码编译时期动态将注解替换为具体的代码。所以JVM实际运行的代码,和我们手动编写的包含了各种工具方法的类相同。另外我仅仅对Lombok做了一些简单介绍,在其官网上还有一些其他注解,并给出了更详细的说明和生成前后的代码例子。有兴趣的同学可以看看。