在一行中初始化来自相同源的多个变量(JAVA)

时间:2017-10-31 11:07:03

标签: java coding-style code-cleanup

鉴于方法:

private Object[] method(){
    //run some codes
    return new Object[]{Obj1, Obj2};
}

请注意,2次不同的运行将提供唯一的输出,因此以下内容将不正确

Object obj1run1 = method()[0], obj2run1 = method()[1];
//Because the method will be run 2 times with 2 unique results;

我知道我可以通过以下方式解决我的问题:

Object hold[] = method();
obj1run1 = hold[0];
obj2run1 = hold[1];

但我正在寻找一种简单快捷的编写代码的方法,比如说:

(obj1run1, obj2run1) = method();
//saw this somewhere but doesnt work on Java

所以我的问题(使用上面的例子):如何在尽可能少的代码行中将数组的内容分配到多个变量中?

2 个答案:

答案 0 :(得分:1)

(obj1run1, obj2run1) = method();

此语法通常称为读取元组,可用于其他几种语言(Swift,最新的C#等)but not in Java

虽然你的解决方案工作正常,但你可能最好创建一个特殊的类来返回你的特定元组。由于您返回的两个对象以某种方式相关,至少由于从同一方法返回,因此为它们定义一个类可能是个好主意:

class HoldingPair {
    private final Object first;
    private final Object second;
    public Object getFirst() { return first; }
    public Object getSecond() { return second; }
    public HoldingPair(Object a, Object b) {
        first = a;
        second = b;
    }
    ... // hashCode, equal, toString
}

现在你的方法可以返回一个HoldingPair对象,你可以直接使用它,例如

HoldingPair hold = method();
...
if (hold.getFirst() != null) {
    ...
}
if (hold.getSecond() != null) {
    ...
}

答案 1 :(得分:1)

您可以混合使用两种解决方案,但不能像python或scala那样进行多种处理。根据上下文,您总能找到一些非常好的东西。最简单的方法是:

Object hold[] = method();
Object obj1run1 = hold[0], obj2run1 = hold[1];

但是如果在语义上你可以创建自己的元组,那么这两个对象之间存在强大的联系。