java16新特性-Records

java14新特性-Records(预览)

Java 14 引入了一项令人期待的新特性——Records 类型,,它通过简化不可变数据的定义和使用,进一步提升了Java语言在数据模型上的表达能力

语法规则

Records 类型使用关键字 record 定义,语法简洁明了。下面是一个基本的 Records 类型的例子

public record Point(int x, int y) {}

Point 是一个 Records 类型,包含两个 int 类型的字段 x 和 y。Records 类型默认是不可变的,字段被声明为 final 并且只有 getter 方法,不可修改

类型的优势

  1. 简洁的定义:通过 record 关键字,可以在一行内定义一个简单的数据封装类,减少了样板代码的编写。

  2. 自动实现方法:编译器会自动为 Records 类型生成 equals、hashCode 和 toString 方法,这些方法基于所有字段的内容。

  3. 不可变性:Records 类型的字段默认是 final 的,并且提供了只读的访问方法,避免了意外的数据修改。

  4. 模式匹配支持:Records 类型与模式匹配结合使用,可以更方便地进行数据的解构和匹配。

应用

Records 类型适用于许多场景,特别是需要简单的数据传输对象(DTOs)、不可变数据类型或者数据传递和序列化的情况

public record Person(String name, int age) {}

// 在代码中使用 Records 类型
Person person = new Person("Alice", 30);
System.out.println(person.name()); // 输出:Alice
System.out.println(person.age()); // 输出:30

相比传统的 Java 类,Records 类型具有更高的可读性和简洁性。通过自动实现方法和不可变性,Records 类型使得数据的定义和使用更加一致和安全,减少了代码的冗余和错误的可能性

java15新特性-Record(第二次预览)

Record类的关键特性

  1. 不可变性:Record默认定义的成员变量是私有的,并且是最终的(final),这意味着一旦Record实例被创建,其内部状态不可被改变。
  2. 自动化方法实现:Record自动实现了equals、hashCode和toString方法,这些方法都是基于Record中声明的所有参数。
  3. 构造器:Record会自动生成一个带有所有成员变量作为参数的构造器,无需开发者手动编写。
  4. 成员变量和访问器方法:Record中声明的所有成员变量都会自动具有getter方法,而无需显式地进行定义。
  5. 结构性表示:Record类允许开发者在定义时提供一个紧凑的结构体形式,使得数据结构的表示更为直观和清晰。
  • 只读类实现
public record Person(String name, int age) {}
  • 反编译后
// Compiled from "ExampleRecord.java"
// 请忽略它是内部类这一点
public final class best.pratice.jdk15.ExampleRecord$Person extends java.lang.Record {
public best.pratice.jdk15.ExampleRecord$Person(java.lang.String, int);
public final java.lang.String toString();
public final int hashCode();
public final boolean equals(java.lang.Object);
public java.lang.String name();
public int age();
}

可见,record为我们省掉了太多的代码了。然而,它确实有一些局限:

  1. 它们是final类型(反编译源码可见)
  2. 它们不能被声明为abstract
  3. 不能使用native方法(这一点对一般开发者没有影响)

java16新特性-Record(正式)

Java 14 引入了一个新的类类型 record 作为预览功能,以方便创建不可变数据对象。 Java 15 进一步增强了 record 记录类型。 在 Java16 中,record 现在是 JDK 的标准功能