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

问题描述 投票:0回答:1

Java 21 记录模式承诺在 Java 语言中引入解构。然而,它似乎与模式匹配紧密耦合,只能用作

instanceof
比较的一部分或在
switch
语句/表达式中。

考虑以下记录。

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

有没有一种方法可以在不使用

instanceof
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);
}
java pattern-matching java-21 record-patterns
1个回答
8
投票

正如 @Michael 的回答中所指出的,目前解构记录模式需要

switch
instanceof
。然而,这个答案并不能反映正在发生的事情。

我很少与 Java 模式匹配的创建者交谈(您可以在 amber-dev 邮件列表上向他们提问),Java 21 中出现的功能只是开始模式匹配。我们甚至还没有达到他们想要包含在模式匹配语言中的内容的一半。我认为我们还没有达到 1/4 点。

现在,为了回答您的具体问题,他们目前正在考虑的功能是为解决您的具体问题而定制的当前称为

match
(或
let
,再次,这是工作正在进行中,所以名字还没有敲定。所有这一切仍然不能保证)。

他们的想法可能会起作用:Java 的未来:记录、密封类和模式匹配 - Jose Paumard

Circle circle = ...;

match Circle(var center, var radius) = circle;
// center and radius are binding variables

现在,这一切都无法保证,因为他们不知道所有这些东西都会按照他们期望的方式工作。如果某些东西不适合该语言,他们就会拒绝包含它。因此,为什么这一切都没有得到保证。但还有更多内容需要他们尝试用语言表达。

我会观看视频的其余部分。他们探索了 更多 Java 中的模式匹配。再说一次,这还不是全部。如果他们所描述的内容只有一半,那么我们还没有接近一半。 Java 的未来令人兴奋!

但是,不要使用

instanceof
switch
来实现此目的。你可以,这不是罪。但他们正在构建您稍后想要用于您的确切用例的实际功能。因此,也许现在使用
instanceof
switch
,然后修复它们,以便在实际功能出现时使用正确的东西。

请注意,领导 Java 模式匹配的人是 @BrianGoetz。如果他看到这个,他将能够比我更详细地回答这个问题。

此外,这里是官方 Java YouTube 频道。他们一直在教这样的事情。他们有一个很棒的视频系列,讨论 Java 21 以及迄今为止 Java 中的模式匹配。

https://www.youtube.com/@java/videos

© www.soinside.com 2019 - 2024. All rights reserved.