如何使用 Lombok 进行优雅的编码
Project Lombok 是一个 java 库,它可以通过注解自动为你要编写的类添加相应功能,如 get/set 方法,提高了开发效率。
引入 POM 依赖。
<!-- Lombok核心依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
<!-- 添加logback日志框架支持,(可有可无) -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.6</version>
</dependency>
查看依赖关系可以发现 logback-classic
依赖了 SLF4J-API
日志门面以及 logback-core
日志实现框架。
关于日志注解的选择,可以参考官方文档。默认的日志输出注释类为被注释的类路径,也可以使用 topic 参数自定义,如@Slf4j(topic="reporting")
. 一般我们都会选择 @Slf4j
这个日志抽象类。在使用这个注解的时候需要导入 SLF4-API 抽象层以及具体的日志实现框架,上方的依赖中我们已经添加了日志依赖。
@CommonsLog
Creates private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
@Flogger
Creates private static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();
@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);
Lombok
的使用主要是几个注解,下面介绍常用的几个注解。
@Getter/@Setter
为属性生成 get 和 set 方法。
@ToString
生成 toString 方法,输出各个属性值。
@EqualsAndHashCode
生成 equals 和 hashCode 方法。
@NoArgsConstructor
生成无惨构造器。
@AllArgsConstructor
生成全参数构造器。
@Data
是一个方便注解,它捆绑了 @ToString
@Getter/@Setter
@EqualsAndHashCode
以及 @RequiredArgsConstructor
.
根据上面的解释,用下面的一个例子演示用法。
import lombok.*;
import lombok.extern.slf4j.Slf4j;
/**
* <p>
* Lombok使用
*
* @Author niujinpeng
* @Date 2018/12/10 11:05
*/
@Slf4j(topic = "Lombok")
public class LombokTest {
public static void main(String[] args) {
Person person1 = new Person();
person1.setName("Darcy");
person1.setAge(22);
person1.setTeacher(true);
log.info(person1.toString());
Person person2 = new Person("Darcy", 22, true);
log.info(person2.toString());
boolean equals = person1.equals(person2);
log.info("Equals:" + equals);
log.info(person1.hashCode() + " and " + person2.hashCode());
}
}
//@Getter
//@Setter
//@ToString
//@EqualsAndHashCode
@Data
@NoArgsConstructor
@AllArgsConstructor
class Person {
private String name;
private Integer age;
private boolean isTeacher;
}
可以看到 Person 类除了几个属性定义之外没有其他任何方法代码,运行 LombokTest 可以在控制台看到输出如下。
12:12:57.687 [main] INFO Lombok - Person(name=Darcy, age=22, isTeacher=true)
12:12:57.690 [main] INFO Lombok - Person(name=Darcy, age=22, isTeacher=true)
12:12:57.690 [main] INFO Lombok - Equals:true
12:12:57.690 [main] INFO Lombok - 1423350487 and 1423350487
Process finished with exit code 0