2014-11-22 65 views
5

當我的代碼我很沮喪與空檢查。特別是在編碼數據結構時!有沒有? Java的運算符執行空指針檢查?

我必須這樣做,因爲

String val; 
if(a != null && a.child != null) 
    val = a.child.getValue(); 
else 
    val = null; 

東西有點這個......

是否有運營商什麼樣的? (這是C#的一部分)爲Java來縮短負擔?

С#例如:

String val = a?.child?.getValue(); 
+2

經常考慮,但沒有。 – MeBigFatGuy 2014-11-22 05:43:27

+0

你的意思是三元操作? '字符串val =(a!= null && a.child!= null)? a.child.getValue():null;' – 2014-11-22 05:43:40

+2

不,他是指elvis運算符?: – MeBigFatGuy 2014-11-22 05:44:06

回答

2

沒有?運營商在Java中,所以,正如Hari指出的那樣,你必須以「冗長的方式」來做事情。然而,人們可以說,這是一個很好的東西,因爲它不鼓勵使用空的。

例如,在OP的代碼,你爲什麼要設置VAL到null如果還是這孩子是不是有?我們假設這是一個函數,val返回。這是一種代碼異味:它只是推動對你的代碼的用戶又一次空檢查的要求。變成null檢查的無休止的循環,完全混亂的代碼和混亂邏輯,因爲維護程序員常常分不清這是不是合法的邏輯,或偏執的前程序員正在悄然忽略的錯誤。 Don't mimic PHP!。從優秀的咆哮報價:

「當面臨着要麼做一些無意義或錯誤中止,它(PHP)會做一些無意義的。」

PHP使一個可怕的設計選擇。 與錯誤無關的事情比放棄錯誤要好得多。

相反,你應該問這樣的問題:

  1. 是什麼意思一個爲空?這是一個編程錯誤?如果是這樣,請拋出一些RuntimeException/IllegalArgumentException。如果這是關鍵的代碼,並且你「不能失敗」,至少要記錄你正在琢磨的東西,所以也許它會被修復。
  2. 如果a.child.getValue()本身返回null,該怎麼辦?我的調用者將如何區分null和「a或child爲null」null? 他們不能
  3. 如果有一個很好的默認值,請使用它。如果您使用的是Collection或Array,則不會傳遞null來表示「空」。通過Collections.emptyXXX(),例如an emptyList,或者一個空數組。不要將字符串設置爲空,而應將其設置爲空字符串""。順便說一句,這使得你的hashCode(), equals(), and compareTo()更簡單!
  4. 使用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()。編寫一個小函數來處理這個問題並處理空值。至少它們被封裝在幾個實用方法中,而不是在任何地方進行長時間的無效檢查。幹。而且,可以肯定的是,支票囉嗦的事實,鼓勵你做一個更好的設計。所以缺乏?操作員是件好事,對吧? :-)

6

沒有

與Java中的大多數事情,你必須做的長篇大論方式。嘿,至少它是更具可讀性 - 如果你必須做一個空檢查,爲什麼不把它明確和容易看到(在這裏扮演魔鬼代言人)

+1

如果答案不明確:C#示例使空檢查*顯式*,它很容易*可見*,並且代碼更具可讀性*。 – 2014-11-27 18:18:24

1

沒有在Java中沒有這樣的運營商。我能想到的最接近的事,即Java支持,是Yoda conditions這將允許你檢查一個值是否是一個常數像

if ("test".equals(str)) 

,而不是

if (str != null && str.equals("test")) 
+0

如果我們不知道「測試」字符串會怎麼樣? – 2014-11-22 05:58:01

+0

@sidkamaria當你不知道「test」字符串時,你不能使用Yoda條件。 – 2014-11-22 06:09:58

+0

這對我來說沒有用處。無論如何知道新的東西:) – 2014-11-22 06:34:00

2

?.操作符不存在在Java中。

的「最」小巧,你可以做什麼?:三元運算符,你可以在「鏈」:

String val = a != null && a.child != null ? a.child.getValue() : null; 

String val = a == null ? null : a.child == null ? null : a.child.getValue(); 
+0

我一直在做...要麼**如果**語句或**三元操作符**。不管怎樣,謝謝:) – 2014-11-22 05:59:55

2

沒有就沒有?運算符在JAVA中。您可以使用!=運算符進行檢查不爲空

String val = (a != null && a.child !== null) ? a.child.getValue() : null;