标签: record-patterns

在java中记录模式,无需instanceof或switch

Java 21记录模式承诺将解构引入 Java 语言。然而,它似乎与模式匹配紧密耦合,只能用作instanceof比较的一部分或在switch语句/表达式中。

考虑以下记录。

public record Point(int x, int y) {}
Run Code Online (Sandbox Code Playgroud)

instanceof有没有一种方法可以在不使用or 的情况下解构该特定类型的对象switch?以下尝试进行解构point。但如果我们假设空安全,该代码就没有什么意义,因为instanceof既没有也没有必要。switch

Point point = new Point(0, 0);

// destructuring with instanceof
if (point instanceof Point(int x, int y)) {
    System.out.printf("Point at (%d,%d)", x, y);
}

// destructuring with switch
switch (point) {
    case Point(int x, int y) -> System.out.printf("Point at (%d,%d)", x, y);
}
Run Code Online (Sandbox Code Playgroud)

java pattern-matching java-21 record-patterns

6
推荐指数
1
解决办法
910
查看次数

为什么空值与记录模式匹配?

我一直在尝试使用 Java 21 中的记录模式进行模式匹配的示例。官方文档断言空值与任何记录模式都不匹配。但是,我尝试这个例子:

record Point(Integer x, Integer y) {}

public class MainPatternMatchingRecord {
    public static void main(String[] args) {
        printSum(new Point(null, 2));
    }

    private static void printSum(Object obj) {
        if (obj instanceof Point(var x, var y)) {
            System.out.println(x + 1);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,根据我对 JEP 的理解,new Point(null, 2)不应该匹配 in instanceof Point(var x, var y),但是当运行程序时,会抛出此异常:

线程“main”中的异常 java.lang.NullPointerException:无法调用“java.lang.Integer.intValue()”,因为“x”为 null

为什么会出现这种行为?应该如何正确解释空值与任何记录模式不匹配?

java pattern-matching record-patterns

1
推荐指数
1
解决办法
113
查看次数

标签 统计

java ×2

pattern-matching ×2

record-patterns ×2

java-21 ×1