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);
}
正如 @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 中的模式匹配。