Lombok 主要作用是什么?它是干嘛的?

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/

截止目前, 星球 内专栏累计输出 80w+ 字,讲解图 3365+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2700+ 小伙伴加入学习 ,欢迎点击围观

Lombok 主要作用是什么?它是干嘛的?Lombok 主要作用是什么?它是干嘛的?

它是什么?

Lombok 是一个超酷的 Java 库,旨在通过减少样板代码来提升开发效率。Java 语言中有许多重复且冗长的代码,比如 getter/setter、构造方法、equalshashCode 方法等,这些代码往往是必需的,但会增加代码量,使类变得臃肿、可读性下降。Lombok 提供了各种注解,自动生成这些样板代码,帮助开发者专注于核心业务逻辑。

主要作用

  • 减少样板代码:Lombok 能自动生成很多 Java 类中常见的样板代码,例如 getter/setter 方法、构造函数、toString()equals()hashCode() 等。这些方法通常没有复杂逻辑,却不可或缺,Lombok 通过注解让这些方法自动生成,使代码更简洁。

  • 提高代码可读性:Lombok 避免了大量的重复代码,使类结构更清晰,让开发人员更容易理解类的核心逻辑。

  • 节省开发时间:减少重复性代码编写时间,加快开发流程。

  • 减少代码出错的机会:自动生成的代码不易出错,避免了手动编写 getter/setter、构造函数时可能出现的错误,尤其是在较大的项目中。

常用注解

以下是一些 Lombok 中的常用注解,它们分别解决不同类型的样板代码需求:

  • @Getter / @Setter:为类中的字段自动生成 gettersetter 方法,减少手动创建这些方法的时间。
  • @ToString:生成 toString() 方法,方便打印对象内容,用于调试。
  • @EqualsAndHashCode:自动生成 equals()hashCode() 方法,尤其适合对集合中的对象进行比较和查找。
  • @NoArgsConstructor / @AllArgsConstructor / @RequiredArgsConstructor:自动生成无参构造函数、全参构造函数以及包含必要参数的构造函数。
  • @Data:这是一个复合注解,等效于 @Getter@Setter@ToString@EqualsAndHashCode@RequiredArgsConstructor 的组合,适合需要完整数据操作的简单类。
  • @Builder:实现构建者模式,为类创建复杂对象时提供灵活的方式。
  • @Value:用于创建不可变对象(immutable objects),类似于 @Data,但所有字段都是 final
  • @Slf4j:自动为类注入 Slf4j 日志对象,方便记录日志。
  • @SneakyThrows:用于 “隐藏” 方法抛出的检查型异常(checked exception),避免显式声明 throws

使用示例

以下是一个使用 Lombok 简化代码的示例。假设我们有一个 Person 类:

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
	// 姓名
    private String name;
    // 年龄
    private int age;
}

上面的代码通过 @Data 注解自动生成了 gettersettertoString()equals()hashCode() 等方法。@NoArgsConstructor@AllArgsConstructor 则分别生成了无参构造器和包含所有字段的全参构造器。相比于手动编写这些方法,Lombok 让代码变得更加简洁。

以上代码相当于:

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

    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

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

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

    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof Person)) {
            return false;
        } else {
            Person other = (Person)o;
            if (!other.canEqual(this)) {
                return false;
            } else if (this.getAge() != other.getAge()) {
                return false;
            } else {
                Object this$name = this.getName();
                Object other$name = other.getName();
                if (this$name == null) {
                    if (other$name != null) {
                        return false;
                    }
                } else if (!this$name.equals(other$name)) {
                    return false;
                }

                return true;
            }
        }
    }

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

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

    public String toString() {
        String var10000 = this.getName();
        return "Person(name=" + var10000 + ", age=" + this.getAge() + ")";
    }

    public Person() {
    }

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

局限性与注意事项

  • 学习曲线:Lombok 注解生成的代码不可见,过度依赖 Lombok 可能会导致新成员理解代码逻辑困难,特别是对未熟悉该工具的团队成员。

  • 兼容性问题:Lombok 基于注解处理器和字节码操作,某些 IDE、框架、Java 版本升级时可能会导致 Lombok 无法正常工作,需要额外的配置或更新。

  • 代码调试:Lombok 自动生成的代码在调试时不可见,可能会影响对代码执行流程的理解。尤其是在调试 equalshashCode 或复杂构造器等方法时。

总结

Lombok 是一个非常实用的 Java 工具,通过自动生成样板代码,帮助开发人员提升开发效率和代码简洁性。然而,使用时也需要平衡其便利性与代码可读性之间的关系,确保团队中的每个人都能理解和掌握这些工具带来的影响。