2010-08-05 75 views
6

如果我嘗試在java中的空字符串上執行.equals(),則會拋出空指針異常。我想知道,如果我想比較,如果一個字符串等一些常量字符串,我可以做到以下幾點:Java等於()排序

MY_CONSTANT_STRING.equals(aStringVariable) 

我知道它會工作,但是這只是真的很差的代碼?

回答

16

這是一個標準的Java習慣用法,開玩笑地稱爲Yoda condition

就我個人而言,我更喜歡明確地處理空案例,但Yoda方式使用了很多,任何有經驗的Java程序員都應該能夠理解立即發生的事情。這很好用。

+0

+1因爲我剛剛瞭解了尤達的條件,感謝這個答案。 http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined/2430307#2430307 – 2010-08-05 20:02:52

4

你有什麼好的。甚至可以使用String文字。

if("value".equals(variable)) { 
    ... 

如果你不喜歡,你總是可以顯式檢查null和平等,這兩個檢查與&&結合。運營商的短路將確保你永遠不會得到NPE。

if((variable != null) && variable.equals("value")) { 
    ... 
+2

如果你希望減少混亂,變量!= null的括號是可選的。 – 2010-08-06 03:49:45

5

這只是真的很差的代碼?

不,這是許多人編寫聲明以避免NPE的方式。

0

不,通常這樣做是爲了避免NPE。但是,我通常更喜歡對null進行顯式檢查。

1

只有在變量可能爲空的正常情況下,例如因爲它剛剛出現屬性映射,我纔會保留「CONSTANT.equals(possibleNull)」代碼而不進行空測試。

同樣你可以不檢查中的instanceof的檢查空脫身 - 樣:

Food dinner = map.get("dinner"); 
if (dinner instanceof Soup) { 
     ((Soup)blah).eat(); 
} // We don't care if it is a Fish or null 

但如果你真的沒想到空,你應該明確地在一個單獨的,如果測試檢查的是,並妥善處理。早期發現這些數據錯誤通常會更好,而不是晚些時候。

0

如果你關心你的代碼的質量,編寫一個助手類,它需要照顧平等的測試:

public class ObjectHelper { 
    public static boolean testEquality(Object o1, Object o2) { 
     if (o1 == null && o2 == null) return true; 
     if (o1 == null) return false; 
     return o1.equalts(o2); 
    } 
} 

然後使用它是這樣的:

if (ObjectHelper.testEquality(aStringVariable, My_CONSTANT_STRING)) 

你所謂的持續不斷地停下來。它可能會在未來某個時間從配置文件讀取。

+0

Java 7有一個內建幫助方法['java.util.Objects.equals(..)'](http://docs.oracle.com/javase/7/docs/api/java/util/Objects.html# equals(java.lang.Object,%20java.lang.Object))。 – 2012-12-20 10:05:52