
在Java开发中,我们经常需要定义数据类(如POJO),用于存储简单的数据。传统的方式需要编写大量样板代码(如构造方法、getter/setter方法、equals和hashCode等),导致代码冗余且不易维护。JDK 16引入了Record类,让数据类的定义变得更加简单优雅,极大减少了样板代码的编写。
猫头虎将带你全面解析Record类的定义与特性,轻松减少代码量,让Java开发更加高效!🚀

粉丝提问: 猫哥,项目里有很多数据类,
getter、setter、构造方法写起来好烦!听说JDK 16有Record类,能简化这些代码?怎么用?猫头虎解析:Record类是JDK 16引入的简化数据封装的新特性,它自动生成构造方法、
getter方法、equals、hashCode和toString等,极大地减少了样板代码。
Record类是一种特殊的类,专用于存储不可变数据。它提供了一种简单、简洁的方式来定义数据对象,并自动生成必要的代码。
特点总结:
equals、hashCode和toString方法。final,不能被修改。传统写法:使用POJO类
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return 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);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}Record类写法:JDK 16+ 🚀
public record Person(String name, int age) {}说明:
record关键字自动生成constructor、getter方法、equals、hashCode和toString。Record类自动提供以下方法:
getter方法:字段名称即为方法名(如name()、age())。equals() 和 hashCode():根据字段值自动生成。toString():格式化输出字段信息。示例代码 🚀
public record Person(String name, int age) {}
public class Main {
public static void main(String[] args) {
Person person1 = new Person("猫头虎", 25);
Person person2 = new Person("猫头虎", 25);
System.out.println(person1.name()); // 调用getter方法,输出:猫头虎
System.out.println(person1); // 自动生成toString(),输出:Person[name=猫头虎, age=25]
System.out.println(person1.equals(person2)); // 比较对象,输出:true
}
}Record类支持自定义构造方法,可以添加额外的逻辑,比如字段验证。
示例:自定义构造方法
public record Person(String name, int age) {
// 自定义构造方法,验证数据
public Person {
if (age < 0) {
throw new IllegalArgumentException("年龄不能小于0");
}
}
}说明:
public Person { }语法定义紧凑构造方法。Record类的字段是final,无法被修改,保证了数据的不可变性。
示例:尝试修改字段
Person person = new Person("猫头虎", 25);
// person.name = "新名字"; // 编译错误,字段是final的,无法修改。Record类同样支持泛型,可以存储任意类型的数据。
示例:泛型Record类
public record Pair<K, V>(K key, V value) {}
public class Main {
public static void main(String[] args) {
Pair<String, Integer> pair = new Pair<>("年龄", 25);
System.out.println(pair); // 输出:Pair[key=年龄, value=25]
}
}特性 | 传统POJO类 | Record类 |
|---|---|---|
代码简洁 | 需要手动编写构造方法、getter、toString等 | 自动生成,代码简洁 |
不可变性 | 字段需手动设为final | 字段天然不可变 |
方法生成 | 需重写equals、hashCode等方法 | 自动生成equals、hashCode和toString |
可读性 | 代码冗余,可读性差 | 代码简单易读 |
Q:Record类适用于哪些场景? A:适用于数据传输对象(DTO)、配置类、返回结果类等,尤其是需要不可变性和简单数据封装的场景。
Q:Record类与Lombok的@Data注解有什么区别? A:
getter、equals、hashCode和toString,大幅减少样板代码。Record类让Java开发更加高效,解决了传统POJO类冗余代码的问题。随着Java的持续发展,Record类将成为数据类定义的首选工具。

掌握Record类,让你的数据封装更简洁高效!