跳转至

Java Record 示例详解

简介

Java Record 是 Java 14 引入的一种新的引用类型,它是一种紧凑、不可变的数据载体,旨在简化创建只包含数据字段和基本访问器方法(getter)、构造函数等的类。通过使用 Record,开发者可以用更少的代码来创建这样的数据类,提高代码的可读性和简洁性。

目录

  1. 基础概念
  2. 使用方法
    • 定义 Record
    • 创建实例
    • 访问字段
  3. 常见实践
    • 与传统类对比
    • 在集合中的使用
  4. 最佳实践
    • 何时使用 Record
    • 与其他特性结合使用
  5. 小结
  6. 参考资料

基础概念

Record 本质上是一种特殊的类,它自动生成了以下内容: - 所有字段的私有 final 修饰符。 - 一个包含所有字段的构造函数(紧凑构造函数)。 - 所有字段的访问器方法(getter)。 - equalshashCodetoString 方法的合理实现。

使用方法

定义 Record

以下是定义一个简单的 Person Record 的示例:

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

在上述代码中,Person 是 Record 的名称,括号内定义了两个字段:name(类型为 String)和 age(类型为 int)。

创建实例

可以像创建普通类实例一样创建 Record 实例:

public class Main {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30);
    }
}

访问字段

通过自动生成的访问器方法来访问字段:

public class Main {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30);
        String name = person.name();
        int age = person.age();
        System.out.println("Name: " + name + ", Age: " + age);
    }
}

在上述代码中,person.name()person.age() 分别用于获取 Person 实例的 nameage 字段值。

常见实践

与传统类对比

传统类实现相同功能可能如下:

public class TraditionalPerson {
    private final String name;
    private final int age;

    public TraditionalPerson(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;
        TraditionalPerson that = (TraditionalPerson) o;
        return age == that.age && Objects.equals(name, that.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "TraditionalPerson{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

可以看到,使用 Record 定义 Person 类更加简洁,无需手动编写构造函数、访问器方法、equalshashCodetoString 方法。

在集合中的使用

Record 可以很方便地在集合中使用,例如 List

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice", 30));
        people.add(new Person("Bob", 25));

        for (Person person : people) {
            System.out.println(person);
        }
    }
}

由于 Record 自动实现了 toString 方法,打印 Person 实例时会输出有意义的信息。

最佳实践

何时使用 Record

  • 数据载体:当一个类主要用于承载数据,并且不需要额外的行为或复杂的逻辑时,使用 Record 是一个很好的选择。例如数据库查询结果的封装、配置参数的传递等场景。
  • 不可变数据:如果数据在创建后不应该被修改,Record 的不可变特性可以保证数据的一致性和安全性。

与其他特性结合使用

  • 模式匹配:Record 可以与 Java 16 引入的模式匹配特性很好地结合使用,使代码更加简洁和易读。例如:
public class Main {
    public static void main(String[] args) {
        Object obj = new Person("Charlie", 28);
        if (obj instanceof Person person) {
            System.out.println("Name: " + person.name() + ", Age: " + person.age());
        }
    }
}

小结

Java Record 为开发者提供了一种简洁、高效的方式来创建不可变的数据类。通过自动生成构造函数、访问器方法以及合理的 equalshashCodetoString 方法,减少了样板代码,提高了代码的可读性和可维护性。在合适的场景下使用 Record,能够显著提升开发效率。

参考资料

希望通过这篇博客,读者能够深入理解并在实际项目中高效使用 Java Record。