likes
comments
collection
share

lombok,精简代码之道

作者站长头像
站长
· 阅读数 16

在当今的软件开发领域,Java 一直是一门被广泛使用的编程语言。然而,Java 的语言特性使得开发人员往往需要编写大量的样板代码,这不仅使得代码变得冗长,而且降低了可读性和维护性。Lombok 是一个可以帮助我们精简 Java 代码的库,通过使用它提供的注解(annotations),我们可以减少样板代码的数量,提高代码质量。本文将介绍 Lombok 的核心功能,并通过实际示例演示如何使用这些功能。

1. Lombok 简介

Lombok 是一个 Java 库,它通过注解的方式,在编译期自动生成代码。它的主要目标是减少样板代码,提高开发效率。Lombok 提供了一系列的注解,你可以将这些注解应用到你的 Java 类中,以此来自动生成 Getter/Setter 方法、构造方法、equals()、hashCode()、toString() 等方法。使用 Lombok,你可以编写更简洁、易读的代码,从而提高生产力。

2. Lombok 的安装

要开始使用 Lombok,首先需要在项目中添加 Lombok 依赖。对于 Maven 项目,可以在 pom.xml 文件中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.20</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

对于 Gradle 项目,可以在 build.gradle 文件中添加以下依赖:

dependencies {
    compileOnly 'org.projectlombok:lombok:1.18.20'
    annotationProcessor 'org.projectlombok:lombok:1.18.20'
}

此外,还需要在你的 IDE 中安装 Lombok 插件。如果你使用的是 IntelliJ IDEA,可以从插件市场中搜索并安装 Lombok 插件。其他 IDE,如 Eclipse、NetBeans 等,也有相应的插件支持。

3. Lombok 的核心功能

Lombok 提供了一系列的注解,以下是一些常用的注解及其用途:

3.1 @Getter 和 @Setter

@Getter 和 @Setter 注解用于自动生成 Getter 和 Setter 方法。这两个注解可以应用于类级别或字段级别。如果将它们应用于类级别,则会为类中的所有字段生成 Getter 和 Setter 方法;如果将它们应用于字段级别,则只会为该字段生成 Getter 和 Setter 方法。

示例:

import lombok.Getter;
import lombok.Setter;

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

上述代码中,我们使用了 @Getter 和 @Setter 注解。通过这两个注解,Lombok 会在编译期自动生成 getName()、setName()、getAge() 和 setAge() 方法。

3.2 @ToString

@ToString 注解用于自动生成 toString() 方法。默认情况下,生成的 toString() 方法会包含所有非静态字段,以及其值。

示例:

import lombok.ToString;

@ToString
public class User {
    private String name;
    private int age;
}

上述代码中,我们使用了 @ToString 注解。Lombok 会在编译期自动生成以下 toString() 方法:

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

3.3 @EqualsAndHashCode

@EqualsAndHashCode 注解用于自动生成 equals() 和 hashCode() 方法。默认情况下,生成的 equals() 和 hashCode() 方法会考虑所有非静态字段。

示例:

import lombok.EqualsAndHashCode;

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

上述代码中,我们使用了 @EqualsAndHashCode 注解。Lombok 会在编译期自动生成 equals() 和 hashCode() 方法,这两个方法会考虑 name 和 age 字段。

3.4 @NoArgsConstructor, @RequiredArgsConstructor 和 @AllArgsConstructor

@NoArgsConstructor、@RequiredArgsConstructor 和 @AllArgsConstructor 注解用于自动生成构造方法。

  • @NoArgsConstructor 生成一个不带参数的构造方法。
  • @RequiredArgsConstructor 生成一个包含所有带有 @NonNull 注解(以及 final 修饰的)字段的构造方法(这个比较好用,可以解决spring的注入问题,减少使用@Autowired)。
  • @AllArgsConstructor 生成一个包含所有字段的构造方法。

示例:

import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.AllArgsConstructor;

@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
public class User {
    @NonNull private String name;
    private int age;
}

上述代码中,我们使用了 @NoArgsConstructor、@RequiredArgsConstructor 和 @AllArgsConstructor 注解。Lombok 会在编译期自动生成以下构造方法:

public User() {
}

public User(String name) {
    this.name = name;
}

public User(String name, int age) {
    this.name = name;
    this.age = age;
}

3.5 @Data

@Data 注解是一个综合性的注解,它包含了 @Getter、@Setter、@ToString、@EqualsAndHashCode 和 @RequiredArgsConstructor 注解的功能。使用这个注解,可以快速地为一个类生成常用的方法。

示例:

import lombok.Data;
import lombok.NonNull;

@Data
public class User {
    @NonNull private String name;
    private int age;
}

上述代码中,我们使用了 @Data 注解。Lombok 会在编译期自动生成 Getter/Setter 方法、toString() 方法、equals() 和 hashCode() 方法以及包含所有带有 @NonNull 注解的字段的构造方法。

3.6 @Log

@Log 注解用于简化日志代码。

@Slf4j
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
    @Override
    @Nullable
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        if (beanName.equals("user")) {
            log.error("postProcessBeforeInstantiation execute :" + beanClass.getName());
        }
        return null;
    }
}

3.7 @Builder

builder注解用于生成建造者模式代码。可以通过简化代码来生成构建器模式的代码。该注解可以自动为类生成一个 builder 类,该类包含类中所有非 final 属性的 setter 方法,并且可以使用链式调用的方式设置属性的值。这使得创建对象变得更加便捷和简单:

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class Person {
    private final String firstName;
    private final String lastName;
    private final int age;
}

Person person = Person.builder()
    .firstName("John")
    .lastName("Doe")
    .age(30)
    .build();

4. Lombok 的优缺点

4.1 优点

  1. 减少样板代码:Lombok 通过注解自动生成代码,降低了手动编写样板代码的工作量。
  2. 提高代码可读性:通过减少样板代码,使得源代码更加简洁,提高了代码的可读性。
  3. 提高开发效率:自动生成的代码减少了手动编写代码的时间,提高了开发效率。

4.2 缺点

  1. 依赖 Lombok 插件:Lombok 是一个编译时代码生成工具,要正确使用它,需要在 IDE 中安装 Lombok 插件。这可能会导致在没有安装插件的 IDE 中查看和编辑代码时出现问题。
  2. 学习成本:虽然 Lombok 的注解使用起来较为简单,但新手可能需要一定时间来熟悉这些注解及其功能。
  3. 隐藏实现细节:Lombok 自动生成的代码会隐藏一些实现细节,这可能会导致在调试和排查问题时遇到困难。

5. 总结

Lombok 是一个很有用的库,它能够帮助我们精简 Java 代码,提高代码质量。通过使用 Lombok 提供的注解,我们可以减少样板代码的数量,编写更简洁、易读的代码。然而,Lombok 也有一些缺点,如依赖插件、学习成本等。在实际项目中,我们需要权衡 Lombok 的优缺点,根据项目需求和团队状况来决定是否使用 Lombok。

转载自:https://juejin.cn/post/7227851219128909883
评论
请登录