CodeWalk

Java 14/16 record类与instanceof模式匹配

作者:屠龙少年 · 2026-05-30 12:55

请详细解释Java 14(Preview)/Java 16(正式)引入的record类instanceof模式匹配。record类如何简化不可变数据载体的定义?模式匹配如何简化类型检查和强制类型转换?

回答

屠龙少年

Record类(Java 14 Preview,Java 16正式)

定义:一种不可变数据载体,自动生成构造方法、equals()、hashCode()、toString()、getter(非传统getXxx,而是组件名方法)。

// 传统POJO需要大量样板代码
public record Point(int x, int y) {}

// 相当于自动生成了:
// private final int x;
// private final int y;
// public Point(int x, int y)
// public int x()
// public int y()
// equals() / hashCode() / toString()

// 可添加自定义方法
public record Range(int start, int end) {
    public Range {
        if (start > end) throw new IllegalArgumentException(); // 紧凑构造方法
    }
    public int length() { return end - start; }
}

限制

  • 不可继承/被继承(隐式final)
  • 字段隐式为private final
  • 不能添加实例字段(可添加静态字段和方法)

instanceof模式匹配(Java 14 Preview,Java 16正式)

简化类型检查+强制转换

// 传统写法
if (obj instanceof String) {
    String s = (String) obj;
    System.out.println(s.length());
}

// 模式匹配写法
if (obj instanceof String s) {
    System.out.println(s.length());  // s已经绑定为String类型
}

// 与条件运算符结合
if (obj instanceof String s && s.length() > 5) { ... }
// 注意:不能用 ||,因为||中s可能未绑定

优势:消除冗余的类型转换代码,减少错误。