详解@Data注解

@Data 是 Lombok提供的注解,不是Java标准库的。

给类加上@Data后,会自动生成以下方法:

  • 所有字段的 getter / setter
  • toString()
  • equals() / hashCode()
  • 构造器(部分情况)

1.getter/setter

总结 getter/setter 的作用:

getter

读取字段值(封装后安全访问)

setter

修改字段值(可以加校验逻辑)

Lombok 的好处

省去重复写这些模板代码

2.toString()

✅ 一、什么是toString()方法?

  • toString()是Java所有类默认继承的方法,定义在Object类中:
public String toString()
  • 它的作用是返回当前对象的字符串表示,比如你打印一个对象:
System.out.println(myObj);

其实底层会自动调用:

System.out.println(myObj.toString());

😵 默认的toString()很难用!

来看一个没重写过的toString()效果:

Person p = new Person();
System.out.println(p); 

输出是这样的:

Person@6f2b958e
  • Person 是类名
  • @6f2b958e 是对象在内存里的地址哈希
  • ❌ 你完全看不出这个对象的内容!

✅ @Data自动生成的toString()就很强!

假设你有个类:

@Data
public class Person {
    private String name;
    private int age;
}

Lombok自动帮你生成的toString()方法类似这样:

@Override
public String toString() {
    return "Person(name=" + this.name + ", age=" + this.age + ")";
}

然后你执行:

Person p = new Person();
p.setName("Tom");
p.setAge(25);
System.out.println(p);

✅ 控制台输出:

Person(name=Tom, age=25)

是不是一目了然!这就是 Lombok 给你带来的好处!

✅ 总结:@Data里的toString()是干什么的?

默认版本

打印的是内存地址,看不懂

@Data版

自动生成显示所有字段和字段值

使用场景

打日志、调试对象内容、快速了解对象状态

好处

无需手写代码,输出更清晰,方便开发

✅ 扩展:我能控制toString()显示哪些字段吗?

可以的,用Lombok的@ToString(exclude = {"password"})这样:

@ToString(exclude = "password")
public class User {
    private String username;
    private String password;
}

输出时就不会显示密码啦。

3.equals() / hashCode()

✅ 一、equals()是干什么的?

📌 它是Java中的一个方法,用来判断两个对象"值上是否相等":

public boolean equals(Object obj)

🧠 默认行为(没重写的情况下):

Person p1 = new Person("Tom", 20);
Person p2 = new Person("Tom", 20);

System.out.println(p1.equals(p2)); // false❌,因为默认是比较内存地址

👉 默认的equals()是这样的:

public boolean equals(Object obj) {
    return this == obj; // 只比较是不是同一个对象
}

✅ 二、@Data自动生成的equals()是什么样?

它会帮你根据字段值来判断对象是否相等,比如:

@Data
public class Person {
    private String name;
    private int age;
}

等同于你手写的:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Person person = (Person) o;
    return age == person.age &&
           Objects.equals(name, person.name);
}

✅ 有了这个之后:

Person p1 = new Person("Tom", 20);
Person p2 = new Person("Tom", 20);

System.out.println(p1.equals(p2)); // true✅

但是关于hashCode()这块我也没太研究明白,可能用的也不多,后面待补充吧。

4.构造器

注意一个重要误区:@Data所默认自带的是一个类默认的无参构造器(构造方法),而绝对不是帮你new了一个新的实例。

✅ @Data自动生成了什么构造器?

严格来说,@Data本身只保证:

  • 自动生成无参构造器(如果你没有定义的话)

但如果你还加上了@AllArgsConstructor、@RequiredArgsConstructor 等注解,就能自动生成带参数的构造器了。

如果你只加@Data,它默认只生成无参构造器。

✅ 举个例子:

@Data
public class Person {
    private String name;
    private int age;
}

编译后相当于:

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

    public Person() {} // 自动生成的无参构造器

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

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

    @Override
    public String toString() {
        return "Person(name=" + name + ", age=" + age + ")";
    }
}
全部评论

相关推荐

昨天 16:45
已编辑
门头沟学院 Java
🔥研0选方向求助!算法(搜推广)/后端/安全/读博何去何从?求前辈指点迷津 🎓背景介绍:28届准研究生(研0),9本top3硕,均科班。实验室主攻基础架构+安全方向。组内硕博师兄产出集中在安全四大;少数涉及AI顶会,AI顶会有部分是联邦学习,感觉离工业界较远,也有AI赋能安全的论文。因为实验室卡资源有限,估计搞不了llm。而且三年后不知道llm会卷成什么样子。感觉安全这个方向太玄乎,基架岗容易搞成运维岗(个人看法 如果有不对请大佬指出)。所以目前还是在偏想着算法或者后端二选一。目前暂不了解组内硕士去向。个人现状:✅ Java八股+项目:Java基础和八股还好,最近就在突击复习,想在开学前先刷一段。有两个完整比较拿得出手的java项目。leetcode也在刷 ❌ 算法零基础:需从头啃机器学习八股。🔒 实习限制:实验室明面不允许日常实习,但应该可偷偷跑路(可以刷一段吧);暑期明确放4个月💡其他:本科没有什么拿得出手的实习经历。个人可卷可躺,IP本地人,硕士在北上广一带。🗣️纠结选项:A. 搜推广:羡慕搜推广高薪资,但也怕三年后搜推广从目前的红海变成死海。B. 后端开发岗优势:Java栈匹配度高,实习资源相对好找劣势:担心未来发展受限,3年后java更加死海。安全/C. 安全优势:组内天然方向劣势: 好像工业界岗位不多D.基础架构or大模型个人不太考虑这俩了,当然也欢迎大伙说说意见。E.读博感谢各位义父!!!!!!!!!!!!#牛客AI配图神器##满分简历要如何准备?# #方向# #研0# #java# #后端# #搜推广# #大模型# #聊聊我眼中的AI# #投递实习岗位前的准备# 引琉:百度 美团 字节 阿里 蚂蚁 小米 京东
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务