Java,为什么有人这样做到三元运算符?

时间:2018-03-02 13:34:36

标签: java

为什么有人会这样做?

int foo;
foo = (true?this.getFoo() : 0); //getFoo() returns int

它突然出现了一堆,我真的不明白这不会总是等同于:

int foo = this.getFoo();

这仅用于int类型的变量,并使用返回int的getter。弦乐不会得到同样的待遇。

编辑以包含答案:(来自Andy Turner的评论)

  

就问题而言,#34;是真的吗? getFoo():0在逻辑上等价   to getFoo()":这在语言规范中得到了回答,它说:   "如果第一个操作数的值为true,则为第二个操作数   表达被选中。" (和"未选择的操作数表达式不是   评估有条件的特定评估   表达",虽然在这种情况下如果0是无关紧要的   评估然后丢弃,因为没有副作用   评估它)

3 个答案:

答案 0 :(得分:8)

在这种情况下,使用三元数绝对没有任何理由。

答案 1 :(得分:6)

如果this.getFoo()IntegerShortByte,则可能会触发使用条件运算符解除拆箱的一些不正常行为。

例如,如果this.getFoo()返回null,则此表达式会生成NullPointerException

除了玩具示例之外,没有充分的理由来写这个。

如果this.getFoo()返回原始类型,则绝对没有理由写它。 foo = true ? this.getFoo() : 0;相当于foo = this.getFoo()

语言规范的相关部分为Sec 15.25,其中包含:

  

如果第一个操作数的值为true,则选择第二个操作数表达式。

(它还说:

  

未针对条件表达式的特定评估

评估未选择的操作数表达式

虽然在这种情况下,如果对0进行评估然后丢弃并不重要,因为没有评估它的副作用。)

条件运算符在装箱和拆箱方面有一些非常奇特的行为。例如:

condition ? 0 : null

选中0,所以总是成功;但

condition ? 0 : (Integer) null

取消装箱 null,当NullPointerException为假时,condition会失败。

而且,显而易见的是

的结果
true ? Integer.valueOf(0) : Double.valueOf(0)

Double

嵌套条件表达式更加阴险,例如

Integer i = condition1 ? 1 : condition2 ? 2 : null;

因为整体表达式的类型为int,而不是Integer,因此您可以获得NullPointerException,即使看起来您正在获得Integer,因为您要分配给Integer类型的变量。实际上,它的评估如下:

Integer i = Integer.valueOf(condition1 ? 1 : (condition2 ? Integer.valueOf(2) : null).intValue()));

条件运算符有一些非常毛茸茸的规则,只有在涉及盒装数字类型时才应该非常谨慎地使用。

答案 2 :(得分:3)

三元毫无意义:条件总是正确的。

就像你写了一样:

/api

这是一个三元有意义的例子 假设foo = this.getFoo(); 返回可能为this.fetFoo()的{​​{1}},您可以编写此代码以阻止Integer

null

或没有重复调用NullPointerException但更详细:

int foo = this.getFoo() == null ? 0 : this.getFoo();