簡體   English   中英

Java,為什么有人對三元運算符這樣做?

[英]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()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 ,因此當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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM