我該如何實現這種平等比較是一種理智的java方式?平等比較 - 任何一種更安全的方式?
boolean x = (a == b) || (a.equals(b))
我要確保這兩個對象的內容相等,但空也行,即既可以爲空,因此是相等的。
更新:只是要清楚,我必須多次實施此比較,並且不想複製&每次都粘貼這些東西,特別是對於長對象名稱。使用'a'和'b'它看起來小而簡單,但往往會增長...我想知道是否我缺少一些現有的Java功能。
我該如何實現這種平等比較是一種理智的java方式?平等比較 - 任何一種更安全的方式?
boolean x = (a == b) || (a.equals(b))
我要確保這兩個對象的內容相等,但空也行,即既可以爲空,因此是相等的。
更新:只是要清楚,我必須多次實施此比較,並且不想複製&每次都粘貼這些東西,特別是對於長對象名稱。使用'a'和'b'它看起來小而簡單,但往往會增長...我想知道是否我缺少一些現有的Java功能。
如果a爲空但b不是?我覺得你真的想:
boolean x = (a == null && b == null) || (a != null && a.equals(b))
編輯:您可以實現對於需要該類的兩個對象,並做比較如上避免重寫,使代碼少許清潔劑類中的靜態NullEquals方法。
public class MyClass {
public static boolean NullEquals(MyClass a, MyClass b)
{
return (a == null && b == null) || (a != null && a.equals(b));
}
}
if (MyClass.NullEquals(a,b))
{
...
}
的典型模式是:
if (a == b)
{
return true;
}
if (a == null || b == null)
{
return false;
}
// Now deal with a and b, knowing that they are non-identical, non-null references
是的,這是羅嗦 - 但是如果你分離出來成爲它自己的方法,你可以把它合理的控制之下。
你可能想看看總是有用的Apache Commons Lang,更準確地說是ObjectUtils.equals()。
另一種方法
boolean x = null==a ? null==b : a.equals(b);
我喜歡這樣 - 在方法中適當包裝 - 除了我厭惡將常量與變量進行比較的樣式而不是相反。當然,在Java中這不是必需的。 – tvanfosson 2008-12-03 13:33:04
不是一個直接的答案,但如果你有大量的對象,可以是或不爲空,可能是表示一些問題與您的代碼。看看Null Pattern,這是一種替代方式來表示沒有對象
無法添加評論, 將此視爲對Jon Skeet的答覆的評論。
在Java中,Null = Null是true還是false。
更具體地說,應該如何處理Null = Null以及不同的語言如何處理這種情況?
做的最常見的方式是:
a==null ? b==null : a.equals(b)
一個潛在的效率更高一點,但不太清楚,表述爲:
a==b || (a!=null && a.equals(b))
當然,你可以把這個方法裏面:
public static boolean eq(Object a, Object b) {
return a==b || (a!=null && a.equals(b));
}
請注意原始問題代碼NPE,如果a爲null且b非空。
出於性能原因,通常在執行任何其他邏輯之前檢查身份是很好的,正如問題中所做的那樣。但是,許多答案都沒有考慮到這一點。
把身份檢查的最佳位置是在equals
方法對您的類的實現:
public boolean equals(Object obj) {
if(this == obj) return true;
...
}
如果這已經/可以做到的,你可以很容易地花了比較:
a == null ? b == null : a.equals(b);
否則,你可能需要檢查自己的身份:
a == null ? b == null : (a == b || a.equals(b));
關於:
boolean x = equals(a, b);
public static boolean equals(Object a, Object b) {
if (a == null && a == b) {
return true;
} else {
return a == b || a.equals(b);
}
}
讓我看看。
Yeap被覆蓋。
感謝您更正 – 2008-12-03 13:11:36
,但如果a爲null且b不是,您也會得到一個空指針 – 2008-12-03 13:13:41