[英]Java, why is someone doing this to the ternary operator?
為什么有人這樣做?
int foo;
foo = (true?this.getFoo() : 0); //getFoo() returns int
它突然冒出一堆,我真的不明白這並不總是等同於:
int foo = this.getFoo();
這僅用於int類型的變量,並使用返回int的getter。 字符串沒有得到相同的處理。
編輯以包含答案:(來自Andy Turner的評論)
關於問題“是真的嗎?getFoo():0在邏輯上等效於getFoo()”:在語言規范中得到回答,它說:“如果第一個操作數的值為true,則第二個操作數表達式被選中。” (並且“對於條件表達式的特定評估,不會選擇未選擇的操作數表達式”,盡管在這種情況下,先評估然后丟棄0並不重要,因為評估它沒有副作用)
在這種情況下,絕對沒有任何理由可以使用三元數。
如果this.getFoo()
是Integer
, Short
或Byte
,則這可能會觸發一些與條件運算符拆箱有關的不良行為。
例如,如果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
框 ,因此當condition
為false時將失敗,並出現NullPointerException
。
而且,值得注意的是
true ? Integer.valueOf(0) : Double.valueOf(0)
是Double
。
對於嵌套條件表達式,它變得更加陰險。
Integer i = condition1 ? 1 : condition2 ? 2 : null;
因為整個表達式的類型是int
型,而不是Integer
,所以即使您看起來是在獲取一個Integer
,您也可以得到一個NullPointerException
,因為您要分配一個Integer
型的變量。 實際上,它的評估如下:
Integer i = Integer.valueOf(condition1 ? 1 : (condition2 ? Integer.valueOf(2) : null).intValue()));
條件運算符有一些毛茸茸的規則,只有在涉及帶框數字類型時,才應格外小心。
三元數沒有意義:條件始終為真。
好像您已經寫過:
foo = this.getFoo();
這是一個三元可能有意義的示例。
假設this.fetFoo()
返回的Integer
可能為null
,則可以編寫此代碼來防止NullPointerException
:
int foo = this.getFoo() == null ? 0 : this.getFoo();
或沒有重復調用this.getFoo()
但更詳細:
Integer fooInteger = this.getFoo();
int foo = fooInteger == null ? 0 : fooInteger;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.