Java object destructuring

2022-09-01 17:20:48

在javascript中,有对象解构,所以我们可以分解对象,如果互斥的对象被多次重读,则只使用结束键。例如)

const person = {
  firstName: "Bob",
  lastName: "Marley",
  city: "Space"
}

因此,与其调用来获取每个值,不如像这样对其进行分解。person.<>

console.log(person.firstName) 
console.log(person.lastName) 
console.log(person.city) 

结构化:

const { firstName, lastName, city } = person;

并像这样调用:

console.log(firstName)
console.log(lastName)
console.log(city)

Java中是否有类似的东西?我有这个Java对象,我需要从中获取值,并且必须调用长中间对象名称,如下所示:

myOuterObject.getIntermediateObject().getThisSuperImportantGetter()
myOuterObject.getIntermediateObject().getThisSecondImportantGetter()
...

我希望以某种方式对其进行分解,并调用最后一个方法,以获得更清晰的代码。getThisSuperImportantGetter()getThisSecondImportantGetter()


答案 1

Java语言架构师Brian Goetz最近谈到了在即将推出的Java版本中添加解构。寻找侧边栏:他论文中的模式匹配章节:

迈向更好的序列化

我非常不喜欢当前提出的语法,但根据Brian的说法,您的用例将如下所示(请注意,此时这只是一个建议,不适用于任何当前版本的Java):

public class Person {
    private final String firstName, lastName, city;

    // Constructor
    public Person(String firstName, String lastName, String city) { 
        this.firstName = firstName;
        this.lastName = lastName;
        this.city = city;
    }

    // Deconstruction pattern
    public pattern Person(String firstName, String lastName, String city) { 
        firstName = this.firstName;
        lastName = this.lastName;
        city = this.city;
    }
}

例如,您应该能够在检查实例中使用该解构模式,如下所示:

if (o instanceof Person(var firstName, lastName, city)) {
   System.out.println(firstName);
   System.out.println(lastName);
   System.out.println(city);
}

抱歉,Brian 在他的示例中没有提到任何直接的解构任务,我不确定这些任务是否会以及如何得到支持。

顺便说一句:我确实看到了与构造函数的预期相似性,但我个人不太喜欢当前的提案,因为“解构函数”的论点感觉像是超参数(Brian在他的论文中说了很多)。对我来说,这在一个每个人都在谈论不变性并使您的方法参数化的世界中存在相当违反直觉。final

我宁愿看到Java跳过围栏并支持多值返回类型。大致如下:

    public (String firstName, String lastName, String city) deconstruct() { 
        return (this.firstName, this.lastName, this.city);
    }

答案 2

据我所知,java不支持这个。

其他名为Kotlin的JVM语言确实支持这一点。

科特林|解构声明