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

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

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

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

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

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

本小节中,我们要来聊一聊如何使用 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 原则,尤其是 "单一职责原则"。一个类应该只有一个变化的原因,如果你发现你的类变得过于复杂,那可能就是你需要将它分解成多个更小的类的信号了。