Lombok @Value 注解:创建不可变类
一则小广告
最近,小哈正在带小伙伴做前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.2 + Vite 4
,手把手教学,前端 + 后端全栈开发,从 0 到 1 讲解每个功能开发过程,1v1 答疑,陪伴式直到项目上线,目前第六章 《Element Plus 手搭 Admin 后台管理骨架》已快完结,截止到目前,已更新 52 节内容,共计 81557 字,演示截图:433 张,持续更新中,后续还会上新更多项目,欢迎点击加入。
本小节中,我们要来聊一聊如何使用 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 原则,尤其是 "单一职责原则"。一个类应该只有一个变化的原因,如果你发现你的类变得过于复杂,那可能就是你需要将它分解成多个更小的类的信号了。