沒有?運營商在Java中,所以,正如Hari指出的那樣,你必須以「冗長的方式」來做事情。然而,人們可以說,這是一個很好的東西,因爲它不鼓勵使用空的。
例如,在OP的代碼,你爲什麼要設置VAL到null
如果還是這孩子是不是有?我們假設這是一個函數,val返回。這是一種代碼異味:它只是推動對你的代碼的用戶又一次空檢查的要求。變成null檢查的無休止的循環,完全混亂的代碼和混亂邏輯,因爲維護程序員常常分不清這是不是合法的邏輯,或偏執的前程序員正在悄然忽略的錯誤。 Don't mimic PHP!。從優秀的咆哮報價:
「當面臨着要麼做一些無意義或錯誤中止,它(PHP)會做一些無意義的。」
PHP使一個可怕的設計選擇。 與錯誤無關的事情比放棄錯誤要好得多。
相反,你應該問這樣的問題:
- 是什麼意思一個爲空?這是一個編程錯誤?如果是這樣,請拋出一些RuntimeException/IllegalArgumentException。如果這是關鍵的代碼,並且你「不能失敗」,至少要記錄你正在琢磨的東西,所以也許它會被修復。
- 如果a.child.getValue()本身返回null,該怎麼辦?我的調用者將如何區分null和「a或child爲null」null? 他們不能。
- 如果有一個很好的默認值,請使用它。如果您使用的是Collection或Array,則不會傳遞null來表示「空」。通過
Collections.emptyXXX()
,例如an emptyList,或者一個空數組。不要將字符串設置爲空,而應將其設置爲空字符串""
。順便說一句,這使得你的hashCode(), equals(), and compareTo()
更簡單!
- 使用Null Object Pattern.。如果a是Foo的一個實例,則定義一個靜態最終Foo.NULL,它具有一個其值本身爲「無效」的孩子 - 無論是null還是「」。
有時你真的不能做任何這些事情。有充足的理由將參數設置爲null,或者您必須允許向前兼容以前的不良設計或第三方庫。國際海事組織,這應該是罕見的,你應該記錄發生了什麼。也許你應該返回除null(或0)以外的東西來反映這一點。例如
/**
countPeople
@param node null means the foobar can't connect to the database,
@return Foobar.ERR_NO_DB if node is null
*/
在OP的例子,它看起來像一個可能是某種形式的XML節點,和Java XML接口是巨大的,對於他們中的一個創造了良好的空對象將是一個非常艱鉅的任務。 (嗯,也許是一個很好的小開源項目?)。但是,在這種情況下,您很可能會撥打a.child.getValue()
。編寫一個小函數來處理這個問題並處理空值。至少它們被封裝在幾個實用方法中,而不是在任何地方進行長時間的無效檢查。幹。而且,可以肯定的是,支票囉嗦的事實,鼓勵你做一個更好的設計。所以缺乏?操作員是件好事,對吧? :-)
經常考慮,但沒有。 – MeBigFatGuy 2014-11-22 05:43:27
你的意思是三元操作? '字符串val =(a!= null && a.child!= null)? a.child.getValue():null;' – 2014-11-22 05:43:40
不,他是指elvis運算符?: – MeBigFatGuy 2014-11-22 05:44:06