@Data注解的妙用
本文最后更新于80 天前,其中的信息可能已经过时,如有错误请发送邮件到3082654005@qq.com

@Data 是 Project Lombok 提供的一个注解,它是一个组合注解(或称为“样板代码终结者”)。它的核心作用是:在编译时,自动为 Java 类生成大量通用的样板代码(Boilerplate Code),从而让你的源代码保持极其简洁和清晰。


为什么需要它?

在传统的 Java 开发中,我们编写一个简单的 POJO(Plain Old Java Object)或实体类(Entity)时,需要反复编写大量的 getter、setter、toString()equals()hashCode() 等方法。这些代码繁琐、重复,且容易出错(例如忘记在修改集合的 setter 中复制内容,或 equals() 方法写得不正确)。

@Data 注解通过自动化生成这些方法,完美地解决了这个问题。


它具体做什么?

当你在一个类上使用 @Data 注解时,Lombok 会在编译期间自动为你生成以下内容:

  1. Getter: 为所有非静态字段生成 getter 方法。
    • 例如:对于 private String name;,会生成 public String getName() { return this.name; }
  2. Setter: 为所有非 final 且非静态的字段生成 setter 方法。
    • 例如:对于 private String name;,会生成 public void setName(String name) { this.name = name; }
  3. toString(): 生成一个包含所有类字段的 toString() 方法。
    • 输出格式类似于:User(name=John, age=30, city=New York)
  4. equals(Object other) 和 hashCode():
    • 生成基于所有非静态非瞬态(non-transient)字段的 equals 和 hashCode 方法。这是实现对象逻辑相等的标准做法,尤其在使用基于哈希的集合(如 HashSetHashMap)时至关重要。
  5. RequiredArgsConstructor: 生成一个必需参数构造器
    • 这个构造器会为所有已初始化且为 final 的字段,以及带有 @NonNull 注解且未初始化的字段生成参数。

简而言之,一个注解相当于写了近几十行代码。


如何使用?

1. 添加 Lombok 依赖

首先,你需要在项目中引入 Lombok。以 Maven 为例,在 pom.xml 中添加:

xml

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version> <!-- 请使用最新版本 -->
    <scope>provided</scope>
</dependency>

2. 在 IDE 中安装 Lombok 插件

为了让你在 IDE(如 IntelliJ IDEA, Eclipse)中编写代码时能够识别 Lombok 生成的代码(例如不报错“找不到 getter 方法”),你需要为 IDE 安装对应的 Lombok 插件。

3. 在类上添加 @Data 注解

java

import lombok.Data;

@Data // 就是这个神奇的注解
public class User {
    private Long id;
    private String name;
    private Integer age;
    private final String country = "China"; // final 字段,只有getter,没有setter
}

使用效果对比

没有 Lombok (@Data) 的代码:

java

public class User {
    private Long id;
    private String name;
    private Integer age;
    private final String country = "China";

    // 以下是手动编写的样板代码
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public Integer getAge() { return age; }
    public void setAge(Integer age) { this.age = age; }
    public String getCountry() { return country; }

    @Override
    public String toString() { ... } // 很长很繁琐

    @Override
    public boolean equals(Object o) { ... } // 很长且容易写错

    @Override
    public int hashCode() { ... } // 很长且容易写错
}

有 Lombok (@Data) 的代码:

java

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private final String country = "China";
}

两份代码的编译结果是完全相同的,但后者显然干净得多。


常用场景

  1. POJO / 值对象 (Value Object):传输数据、作为方法参数或返回值。
  2. 持久化实体 (Entity):如 JPA 实体类(常与 @Entity 等注解一起使用)。
  3. DTO (Data Transfer Object):在不同层之间传输数据。
  4. 配置类:存储配置信息。

重要注意事项和进阶用法

  1. 不可变对象:如果你希望创建一个不可变对象(Immutable Object),应该使用 @Value 注解代替 @Data@Value 会将类本身和所有字段都设为 final,只生成 getter,不生成 setter。
  2. 继承@Data 生成的 equals() 和 hashCode() 方法默认不会调用父类的方法。如果你在类继承结构中使用了 @Data,需要特别注意这一点。可以使用 @EqualsAndHashCode(callSuper = true) 来显式配置,让它包含父类的字段。
  3. 排除字段:如果你不希望某个字段参与生成的 toStringequals, 和 hashCode 方法,可以给它加上 @ToString.Exclude 和 @EqualsAndHashCode.Exclude 注解。
  4. 自定义构造器@Data 不会生成无参构造器或全参构造器,它只生成必需参数构造器。如果你需要无参构造器,可以额外添加 @NoArgsConstructor;如果需要全参构造器,可以添加 @AllArgsConstructor
  5. 谨慎使用:虽然 @Data 非常方便,但它会为你生成所有字段的 setter。在某些场景下(如领域模型),你可能不希望所有字段都能被随意修改,此时更精细地使用 @Getter@Setter 等注解可能是更好的选择。

总结

特性说明
本质Lombok 提供的组合注解,用于在编译时自动生成代码。
生成内容Getter, Setter, toString()equals()hashCode(), 必需参数构造器。
优点极大减少样板代码,提高开发效率,使代码更简洁,减少人为错误。
适用场景POJO、Entity、DTO、配置类等主要用于承载数据的类。
注意注意继承关系中的 equals/hashCode;对于不可变对象,使用 @Value

@Data 是 Lombok 中最受欢迎的注解之一,它极大地提升了 Java 开发的体验和效率,是现代 Java 开发(特别是 Spring Boot 开发)中的标配工具。

文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇