SpringBoot 开发实践(8):使用 Lombok 净化重复代码

前言

在日常开发中,我们时常需要编写一些重复的、非业务相关的功能性代码。比如实体类私有属性的 get / set 方法、创建日志输出类等。

这也是 Java 饱受诟病的地方之一。往往这些冗余的代码虽然跟业务无关,但由于其功能性又不得不写,十分浪费时间,影响美观不说,后期如果有改动还不方便维护。

为了解决上述痛点,就不得不提到神器 Lombok 了。有了 Lombok,在开发中我们就可以使用简单的注解,来避免编写那些重复的功能性代码。在编译的时候,Lombok 会根据注解自动帮我们生成我们省去的那些代码。是不是很神奇?那么接下来我就来介绍下 Lombok 的常见使用方法。

环境配置

添加 Maven 依赖

pom.xml 添加 Maven 依赖。

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.16.22</version>
</dependency>

在 IDEA 中添加 Lombok 插件

打开 IntelliJ IDEA -> Preferences -> Plugins,搜索“Lombok”并安装。
在这里插入图片描述

如果不安装该插件,是不影响程序的正常运行。但是在开发中会出现红波浪线浪报警,看着令人恼火。安装这个插件,是为了让编译器支持解析 Lombok 注解,在使用时不报错。

Lombok 的使用

@Getter & @Setter

@Getter & @Setter 注解可以用于自动生成实体类中私有属性的 getset 方法。

Lombok 写法

@Getter
@Setter
public class Person {
    private int id;
    private String name;
    private int age;
}

@Getter & @Setter 注解打在类上,那么该类中的所有方法都将生成 getset 方法。如果想要对个别属性单独配置,也可以将 @Getter & @Setter 注解打在需要的属性上。

等价的 Java 代码

public class Person {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

@ToString

用于重写 toString() 方法,将类中的属性一次输出。

Lombok 写法

@ToString(callSuper = true)
public class Person {
    private int id;
    private String name;
    private int age;
}

等价的 Java 代码

public class Person {
    private int id;
    private String name;
    private int age;

    public String toString() {
        return "Foo(super=" + super.toString() + 
        ", id=" + this.id + 
        ", name=" + this.name + 
        ", age=" + this.age + ")";
    }
}

@ToString() 中常用属性:

  • callSuper: 默认为 false。true 时会把 super 中的 toString() 方法一并输出。
  • onlyExplicitlyIncluded:是否只输出指定属性。默认为 false。
  • include:可以指定要输出哪些属性。要配合 onlyExplicitlyIncluded 属性使用。
  • exclude:可以指定不输出哪些属性。

@EqualsAndHashCode

用于重写 equals()hashCode() 方法。

Lombok 写法

@EqualsAndHashCode
public class Person {
    private int id;
    private String name;
    private int age;
}

等价的 Java 代码

public class Person {
    private int id;
    private String name;
    private int age;

    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof Person2)) {
            return false;
        } else {
            Person2 other = (Person2)o;
            if (!other.canEqual(this)) {
                return false;
            } else if (this.id != other.id) {
                return false;
            } else {
                Object this$name = this.name;
                Object other$name = other.name;
                if (this$name == null) {
                    if (other$name == null) {
                        return this.age == other.age;
                    }
                } else if (this$name.equals(other$name)) {
                    return this.age == other.age;
                }

                return false;
            }
        }
    }

    protected boolean canEqual(final Object other) {
        return other instanceof Person2;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        int result = result * 59 + this.id;
        Object $name = this.name;
        result = result * 59 + ($name == null ? 43 : $name.hashCode());
        result = result * 59 + this.age;
        return result;
    }
}

@Data

一般,我使用 @Data 注解最多。@Data 注解是将 @ToString@EqualsAndHashCode@Getter@Setter 集合与一身。

Lombok 写法

@Data
public class Person {
    private int id;
    private String name;
    private int age;
}

等价的 Java 因为篇幅过长我就不贴了,因为是集合上述的四个注解,所以等价代码等于上述等价代码的合并。

@Log

@Log 类注解用于创建日志输出类。支持如下几种模式,分别对应不同的日志框架。

  • @CommonsLog
  • @Flogger
  • @JBossLog
  • @Log
  • @Log4j
  • @Log4j2
  • @Slf4j
  • @XSlf4j
  • @CustomLog

我常用的类型是 @Slf4j

Lombok 写法

@Slf4j
@Service
public class MyServiceImpl implements MyService {
    @Override
    public void test() {
        log.info("使用 @Slf4j 输出日志");
    }
}

等价的 Java 代码

@Service
public class MyServiceImpl implements MyService {
    private static final Logger log = LoggerFactory.getLogger(MyServiceImpl.class);

    public MyServiceImpl() {
    }

    public void test() {
        log.info("使用 Logger 输出日志");
    }
}

以上就是开发中常用的 Lombok 注解,确实能在很大程度上帮助我们简化代码,让开发人员把更多精力集中在业务代码的编写。尤其是在对 POJO 的操作上,碰上属性特别多的类,只需要标注一个 @Data 注解,就能少些很多代码。

本文仅介绍一些常用的 Lombok 注解。想要了解更多 Lombok 内容,可以参考其它资料。

本章代码地址:GitHub


推荐文章:


我是因特马,一个爱分享的斜杠程序员~

欢迎关注我的公众号:一只因特马


原文作者: 一只因特马
原文链接: https://www.interhorse.cn/a/68291188/
版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-ND 许可协议。转载请注明出处!

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页