Lombok @Value 注解:创建不可变类

更新时间 2023-07-27 09:53:27

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第2个项目《仿小红书(微服务架构)》正在更新中。第1个项目:全栈前后端分离博客项目已经完结,演示地址:http://116.62.199.48/。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 255 小节,累计 39w+ 字,讲解图:1716 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1300+ 小伙伴加入,欢迎点击围观

本小节中,我们要来聊一聊如何使用 Lombok 的 @Value 注解来创建不可变类

1. @Value 是什么?

@Value 是 Lombok 提供的一个强大的注解,可以帮助我们快速创建不可变类。所谓 "不可变类",就是指一旦创建,它的状态就不能改变的类。这样的类在多线程环境下特别有用,因为它们不需要任何同步。Java 中最典型的不可变类就是 String 类。

2. 如何使用 @Value

使用 @Value 非常简单,只需要在类定义上添加 @Value 注解即可:

import lombok.Value;

@Value
public class Point {
    private int x;
    private int y;
}

上面这段代码定义了一个表示二维坐标的 Point 类。因为我们在类定义上添加了 @Value 注解,Lombok 会为我们做以下的事情:

  • 自动为所有字段添加 private final 修饰符,使得它们在初始化后就不能再被改变。
  • 自动生成所有字段的 Getter 方法,因为字段是 final 的,所以没有 Setter 方法。
  • 自动生成 equals(), hashCode()toString() 方法。
  • 自动生成一个全参数的构造方法。

实际上,@Value 就是 @Getter @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @AllArgsConstructor @EqualsAndHashCode @ToString 的集合。

3. 当我需要修改对象状态怎么办?

既然 @Value 创建的是不可变对象,那如果我需要修改对象的状态怎么办呢?别担心,这种情况下你可以创建一个新的对象。例如,如果你需要移动一个 Point 对象,你可以这样做:

Point p1 = new Point(1, 2);
Point p2 = new Point(p1.getX() + 1, p1.getY() + 1);

4. 结语

Lombok 的 @Value 注解让创建不可变类变得非常简单。然而,正如我在之前的教程中所说,虽然 Lombok 是个强大的工具,但并不意味着你应该在所有地方都使用它。在使用 Lombok 的时候,你还需要记住 SOLID 原则,尤其是 "单一职责原则"。一个类应该只有一个变化的原因,如果你发现你的类变得过于复杂,那可能就是你需要将它分解成多个更小的类的信号了。