如果我嘗試在java中的空字符串上執行.equals()
,則會拋出空指針異常。我想知道,如果我想比較,如果一個字符串等一些常量字符串,我可以做到以下幾點:Java等於()排序
MY_CONSTANT_STRING.equals(aStringVariable)
我知道它會工作,但是這只是真的很差的代碼?
如果我嘗試在java中的空字符串上執行.equals()
,則會拋出空指針異常。我想知道,如果我想比較,如果一個字符串等一些常量字符串,我可以做到以下幾點:Java等於()排序
MY_CONSTANT_STRING.equals(aStringVariable)
我知道它會工作,但是這只是真的很差的代碼?
這是一個標準的Java習慣用法,開玩笑地稱爲Yoda condition。
就我個人而言,我更喜歡明確地處理空案例,但Yoda方式使用了很多,任何有經驗的Java程序員都應該能夠理解立即發生的事情。這很好用。
你有什麼好的。甚至可以使用String文字。
if("value".equals(variable)) {
...
如果你不喜歡,你總是可以顯式檢查null
和平等,這兩個檢查與&&
結合。運營商的短路將確保你永遠不會得到NPE。
if((variable != null) && variable.equals("value")) {
...
如果你希望減少混亂,變量!= null的括號是可選的。 – 2010-08-06 03:49:45
這只是真的很差的代碼?
不,這是許多人編寫聲明以避免NPE的方式。
不,通常這樣做是爲了避免NPE。但是,我通常更喜歡對null進行顯式檢查。
只有在變量可能爲空的正常情況下,例如因爲它剛剛出現屬性映射,我纔會保留「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
但如果你真的沒想到空,你應該明確地在一個單獨的,如果測試檢查的是,並妥善處理。早期發現這些數據錯誤通常會更好,而不是晚些時候。
如果你關心你的代碼的質量,編寫一個助手類,它需要照顧平等的測試:
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))
你所謂的持續不斷地停下來。它可能會在未來某個時間從配置文件讀取。
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
+1因爲我剛剛瞭解了尤達的條件,感謝這個答案。 http://stackoverflow.com/questions/2349378/new-programming-jargon-you-coined/2430307#2430307 – 2010-08-05 20:02:52