Record

record 是 JDK 16 增加到关键字。

record定义的是希望成为数据传输对象(也叫数据载体)的类。当使用record关键字时,编译器会自动生成:

  •     不可变的字段
  •     一个规范的构造器
  •     每个元素都有的访问器方法
  •     equals()
  •     hashCode()
  •     toString()

import java.util.Map;

/**
 * <p>
 * </p>
 *
 * @author snail
 * @since 2022/7/23
 */
record Employee(String name, int id) {}

public class BasicRecord {

    public static void main(String[] args) {
        var bob = new Employee("Bob Dobbs", 11);
        var dot = new Employee("Dorothy Gale", 9);
        // bob.id = 12; // 错误:
        // id在Employee中的访问权限为private
        System.out.println(bob.name()); // 访问器
        System.out.println(bob.id()); // 访问器
        System.out.println(bob); // toString()
        // Employee可以用做Map中的键:
        var map = Map.of(bob, "A", dot, "B");
        System.out.println(map);
    }

} 

record可以定义方法,只能读取字段值; record 不能继承,隐式final,可以实现接口,可以使用紧凑构造器(没有参数列表)。

interface Star {
    double brightness();
    double density();
}

record RedDwarf(double brightness) implements Star {
    @Override public double density() { return 100.0; }
}
record Point(int x, int y) {
    void assertPositive(int val) {
        if(val < 0)
            throw new IllegalArgumentException("negative");
    }
    Point { // 紧凑:没有参数列表
        assertPositive(x);
        assertPositive(y);
    }
}


代码来自:《OnJava》

详细视频教程介绍:Clean Application Development with Records, Sealed Classes and Pattern Matching