1 简介
Lombok, 印尼的一个岛屿, 龙目岛. 但在 Java 的世界里, 它是一个方便的类库, 能提供很多便利, 因此得到许多人的青睐. 但也有不少反对声音. 这是为什么呢?
之前去龙目岛拍的日落.
2 Lombok 提供的便利
一般我们在 Java 中用到 POJO 时, 就很容易想到要用 Lombok, 如 VO,DTO,DO 等. 使用 Lombok 需要安装对应 IDE 的插件, 同时需要引入依赖:
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <version>1.18.10</version>
- <scope>provided</scope>
- </dependency>
举个例子, 如果不用 Lombok, 实现 getter/setter,equals,hashCode,toString 代码量非常大, 如下所示:
- package com.pkslow.basic.lombok;
- import java.util.Objects;
- public class Book {
- private String name;
- private int id;
- private double price;
- private String author;
- private String desc;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public double getPrice() {
- return price;
- }
- public void setPrice(double price) {
- this.price = price;
- }
- public String getAuthor() {
- return author;
- }
- public void setAuthor(String author) {
- this.author = author;
- }
- public String getDesc() {
- return desc;
- }
- public void setDesc(String desc) {
- this.desc = desc;
- }
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- Book book = (Book) o;
- return id == book.id &&
- Double.compare(book.price, price) == 0 &&
- Objects.equals(name, book.name) &&
- Objects.equals(author, book.author) &&
- Objects.equals(desc, book.desc);
- }
- @Override
- public int hashCode() {
- return Objects.hash(name, id, price, author, desc);
- }
- @Override
- public String toString() {
- return "Book{" +
- "name='" + name + '\'' +
- ", id=" + id +
- ", price=" + price +
- ", author='" + author + '\'' +
- ", desc='" + desc + '\'' +
- '}';
- }
- }
而且大部分是样板代码, 没有太多实际逻辑.
如果使用 Lombok 则非常简单, 一个注解 @Data 就可以完成以上工作 (安装了 Lombok 插件后才能显示右边的方法):
Lombok 的常用注解有:
@NonNull: 用于做空指针异常检测;
@Cleanup: 自动资源关闭;
@Getter/@Setter: 自动生成 get/set 方法;
@ToString: 生成 toString 方法, 方便打印调试;
@EqualsAndHashCode: 生成 equals 和 hashCode 方法, 注意这两个应该同时去实现;
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor: 构造方法;
@Data: 相当于 @ToString+ @EqualsAndHashCode+@Getter+ @Setter +@RequiredArgsConstructor.
@Builder: 生成 builder 方法;
@Log: 日志相关:
- @CommonsLog:org.apache.commons.logging.LogFactory.getLog(LogExample.class);
- @Flogger:com.google.common.flogger.FluentLogger.forEnclosingClass();
- @JBossLog:org.jboss.logging.Logger.getLogger(LogExample.class);
- @Log:java.util.logging.Logger.getLogger(LogExample.class.getName());
- @Log4j:org.apache.log4j.Logger.getLogger(LogExample.class);
- @Log4j2:org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
- @Slf4j:org.slf4j.LoggerFactory.getLogger(LogExample.class);
- @XSlf4j:org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
- @CustomLog:com.foo.your.LoggerFactory.createYourLogger(LogExample.class);
所以 Lombok 确实能给我们带来极大的便利, 减少大量重复, 无业务逻辑的代码, 代码显得比较干净; 修改了 field 的名字, 不用多处修改; 提高开发效率.
3 Lombok 所带来的问题
当然, 也有人提出了不同意见:
调试时没有具体代码, 不方便 Debug;
需要强制别人安装第三方插件, 不然会显示报错;
在检查测试覆盖率的时候, 无法直观显示哪些代码已覆盖和未覆盖;
无法按自己意愿实现, 比如 toString 方法, 有时需要输出不一样的 String 格式, 并不一定是按 Lombok 的实现;
对于一些常用的方法, IDE 已经可以自动生成, 不需要 Lombok 一样可以高效开发.
IDEA 没有提供 Builder, 但可以通过安装插件方式使用.
成功安装后, 就能生成 Builder 代码了:
4 总结
一开始我是支持使用 Lombok 的, 经过一段时间使用及出现了一些问题后, 我还是觉得通过 IDE 自动生成代码的方式更适合. 毕竟强制要求别人安装插件这种实在是太野蛮了, 而通过 IDEA 生成代码, 别人不安装插件也不会有报错.
另外, 多几行代码还能体现工作量, 哈哈哈哈哈哈......
来源: https://www.cnblogs.com/larrydpk/p/13140542.html