Lombok的使用

背景介绍

在日常开发中免不了进行一些繁琐的代码自动生成,虽然 ide 的功能已然非常强大但是并不能够做到动态,lombok 可以非常好的解决这个问题。它会在生成 class 文件时将其进行编译成平常所写的代码,这里介绍一些我个人觉得比较好用的注解

lombok

先上官网地址。如果想了解更多注解可以去 https://projectlombok.org/features/all

get/set 注解(重要)

此部分注解有 @Data、@Getter、@Setter,一般普通 Bean 对象会使用 @Data 注解(里面已经包含另外两个注解),如果是 enum 则使用 @Getter 注解

@Data
static class DataBean {
    private String name;
}
// 使用方法如下
public static void DataBeanExample() {
    log.info(new DataBean().getName());
}

生成核心代码如下

static class DataBean {
    private String name;
    public DataBean() {
    }
    public String getName() {
        return this.name;
    }
    public void setName(final String name) {
        this.name = name;
    }
    ...
}

常规构造方法注解 (重要)

此部分注解包含 @NoArgsConstructor 无参构造、@AllArgsConstructor 所有参构造、@EqualsAndHashCode、@ToString

@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@ToString
static class ConstructorBean {
    private String name1;
    private String name2;
}
// 使用方法如下
public static void ConstructorExample() {
    log.info(new ConstructorBean("1", "2").toString());
}

生成核心代码如下

static class ConstructorBean {
    private String name1;
    private String name2;
    public ConstructorBean() {
    }
    public ConstructorBean(final String name1, final String name2) {
        this.name1 = name1;
        this.name2 = name2;
    }
    public boolean equals(final Object o) {
        //....
    }
    protected boolean canEqual(final Object other) {
        return other instanceof LombokExample.ConstructorBean;
    }
    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $name1 = this.name1;
        int result = result * 59 + ($name1 == null ? 43 : $name1.hashCode());
        Object $name2 = this.name2;
        result = result * 59 + ($name2 == null ? 43 : $name2.hashCode());
        return result;
    }
    public String toString() {
        return "LombokExample.ConstructorBean(name1=" + this.name1 + ", name2=" + this.name2 + ")";
    }
}

build 构造方法 (重要)

此部分注解包含 @Builder

@Builder
@ToString
static class BuilderBean {
    private String name1;
    private String name2;
}
// 使用方式如下
public static void BuilderExample() {
    log.info(BuilderBean.builder().name1("1").name2("2").build().toString());
}

生成核心代码如下

static class BuilderBean {
    private String name1;
    private String name2;
    BuilderBean(final String name1, final String name2) {
        this.name1 = name1;
        this.name2 = name2;
    }
    public static LombokExample.BuilderBean.BuilderBeanBuilder builder() {
        return new LombokExample.BuilderBean.BuilderBeanBuilder();
    }
    public String toString() {
        return "LombokExample.BuilderBean(name1=" + this.name1 + ", name2=" + this.name2 + ")";
    }
    public static class BuilderBeanBuilder {
        private String name1;
        private String name2;
        BuilderBeanBuilder() {
        }
        public LombokExample.BuilderBean.BuilderBeanBuilder name1(final String name1) {
            this.name1 = name1;
            return this;
        }
        public LombokExample.BuilderBean.BuilderBeanBuilder name2(final String name2) {
            this.name2 = name2;
            return this;
        }
        public LombokExample.BuilderBean build() {
            return new LombokExample.BuilderBean(this.name1, this.name2);
        }
        public String toString() {
            return "LombokExample.BuilderBean.BuilderBeanBuilder(name1=" + this.name1 + ", name2=" + this.name2 + ")";
        }
    }
}

链式构造方法

此部分注解包含 @Accessors, 但是因为改写了 set 方法的返回值,有些时候会和其它 bean 工具类不兼容,一般不建议使用

@Accessors(chain = true)
@Setter
@ToString
static class ChainBean {
    private String name1;
    private String name2;
}
// 使用方式如下
public static void ChainExample() {
    log.info(new ChainBean().setName1("1").setName2("2").toString());
}

生成核心代码如下

static class ChainBean {
    private String name1;
    private String name2;
    ChainBean() {
    }
    public LombokExample.ChainBean setName1(final String name1) {
        this.name1 = name1;
        return this;
    }
    public LombokExample.ChainBean setName2(final String name2) {
        this.name2 = name2;
        return this;
    }
    ...
}

日志注解 (重要)

此部分注解包含 @Slf4j,其它的注解都不重要,这个会自动根据引入包进行选择

@Slf4j
public class LombokExample {
    public static void main(String[] args) {
        log.info("123");
    }
}

生成核心代码如下

private static final Logger log = LoggerFactory.getLogger(LombokExample.class);

关闭流

@Cleanup, 这个可以帮助关闭流,需要注意的是需要对其捕获 IO 异常。虽然不错,但是有了 trywith 的写法以后就用的不多了。

public static void CloseExample() throws FileNotFoundException {
    try {
        @Cleanup FileInputStream fileInputStream = new FileInputStream("");
    } catch (IOException e) {

    }
}

生成核心代码如下
可以看到会帮我们进行 close。不过并没有在 finally 里面不建议使用

public static void CloseExample() throws FileNotFoundException {
    try {
        FileInputStream fileInputStream = new FileInputStream("");
        if (Collections.singletonList(fileInputStream).get(0) != null) {
            fileInputStream.close();
        }
    } catch (IOException var1) {
    }

}

这里推荐 try-with-resources 写法

public static void CloseExample2() {
    try (FileInputStream fileInputStream = new FileInputStream("")) {
        log.info("123");
    } catch (IOException e) {
    }
}

生成核心代码如下
可以看到是在 finally 里面关闭了流,并且各种判断非常全面

 public static void CloseExample2() {
     try {
         FileInputStream fileInputStream = new FileInputStream("");
         Throwable var1 = null;
         try {
            log.info("123");
        } catch (Throwable var11) {
            var1 = var11;
            throw var11;
        } finally {
            if (fileInputStream != null) {
                if (var1 != null) {
                    try {
                        fileInputStream.close();
                    } catch (Throwable var10) {
                        var1.addSuppressed(var10);
                    }
                } else {
                    fileInputStream.close();
                }
            }
        }
    } catch (IOException var13) {
    }
}

异常注解

在捕获编译时异常的时候比较好用,但是现在越来越多的工具类都对编译异常捕获了,它的出场机会并不多

@SneakyThrows({IOException.class})
public static void ExceptionExample() {
    CloseExample();
}

生成核心代码如下
唯一的功能就是捕获编译时异常,不用手动去写

public static void ExceptionExample() {
    try {
        CloseExample();
    } catch (IOException var1) {
        throw var1;
    }
}

delombok

如果后面不想用注解则需要使用 delombok 官网

  • 方法一
    在新版的 idea 中 refactor->delombok 已经集成了 delombok,可以直接还原算是比较方便的

  • 方法二

java -jar lombok.jar delombok src -d src-delomboked

注意替换包名

posted @ 2022-05-26 15:31  Faetbwac  阅读(8)  评论(0编辑  收藏  举报