三元运算符中嵌套三元运算符的 Java 代码,如何计算?

6

这可能是一个非常基础的问题,我想知道这段代码是如何被解读的:

return someboolean ? new someinstanceofsomething() : someotherboolean ? new otherinstance() : new third instance(); 

我猜现在当我写下这篇文章时,我有点理解这个陈述了。如果为真,则返回选项1,但如果为假,则进行另一个布尔检查并返回剩余两个选项之一?我将继续保留此问题,因为我以前没有见过它,也许其他人也是如此。

你能无限制地使用三元运算符吗?

编辑:此代码与使用大量if语句相比,好在哪里/不好在哪里?

2个回答

17

它在JLS#15.25中定义:

条件运算符在语法上是右关联的(从右到左分组)。因此,a?b:c?d:e?f:ga?b:(c?d:(e?f:g))相同。

在你的情况下,

return someboolean ? new someinstanceofsomething() : someotherboolean ? new otherinstance() : new third instance();

等价于:

return someboolean ? new someinstanceofsomething() : (someotherboolean ? new otherinstance() : new third instance());

谢谢您指出它是右结合的。对于处理器处理代码的方式,这比if/if else语句更可取吗? - user2097211
2
@user2097211 不要担心处理器 - 关注未来的可维护性,做最易于阅读的事情。在90%以上的情况下,这是一个if/else语句。我怀疑它会产生相同的字节码。 - Duncan Jones
@user2097211 这很不可能对性能产生任何影响。 - assylias

7
三元运算符是从右往左计算的。参见assylias的答案以获取JLS参考文献。
你的例子将被翻译为:
if (someboolean) {
  return new someinstanceofsomething();
} else {
  if (someotherboolean) {
    return new otherinstance();
  } else {
    return new thirdinstance()
  }
}

是的,你可以无限嵌套这些标签。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接