Java对象解构

时间:2019-06-13 17:53:51

标签: java object destructuring

在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()以获得更干净的代码。

2 个答案:

答案 0 :(得分:2)

据我所知,java不支持此功能。

其他称为Kotlin的JVM语言也支持此功能

Kotlin | Destructuring Declarations

答案 1 :(得分:0)

Java语言架构师Brian Goetz最近谈到了要在即将发布的Java版本中添加解构功能。在他的论文中找到 Sidebar:模式匹配一章:

Towards Better Serialization

我非常不喜欢当前的语法建议,但是根据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;
    }
}

例如,您应该能够在instanceof检查中使用该解构模式,例如:

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

抱歉,Brian在示例中未提及任何直接的销毁任务,我不确定是否以及如何支持这些任务。

旁注:我确实看到了与构造函数的预期相似性,但是我个人不太喜欢当前的提议,因为“解构函数”的参数感觉像是超参数(布莱恩在论文中说了很多)。对我来说,这在每个人都在谈论不变性并让您的方法参数为final的世界中,是一种反直观的做法。

我希望看到Java越过篱笆,改为支持多值返回类型。类似于:

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