2008-12-03 51 views
2

我該如何實現這種平等比較是一種理智的java方式?平等比較 - 任何一種更安全的方式?

boolean x = (a == b) || (a.equals(b)) 

我要確保這兩個對象的內容相等,但空也行,即既可以爲空,因此是相等的。

更新:只是要清楚,我必須多次實施此比較,並且不想複製&每次都粘貼這些東西,特別是對於長對象名稱。使用'a'和'b'它看起來小而簡單,但往往會增長...我想知道是否我缺少一些現有的Java功能。

回答

5

如果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)) 
{ 
    ... 
} 
+0

感謝您更正 – 2008-12-03 13:11:36

+0

,但如果a爲null且b不是,您也會得到一個空指針 – 2008-12-03 13:13:41

5

的典型模式是:

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 

是的,這是羅嗦 - 但是如果你分離出來成爲它自己的方法,你可以把它合理的控制之下。

8

另一種方法

boolean x = null==a ? null==b : a.equals(b); 
+0

我喜歡這樣 - 在方法中適當包裝 - 除了我厭惡將常量與變量進行比較的樣式而不是相反。當然,在Java中這不是必需的。 – tvanfosson 2008-12-03 13:33:04

1

不是一個直接的答案,但如果你有大量的對象,可以是或不爲空,可能是表示一些問題與您的代碼。看看Null Pattern,這是一種替代方式來表示沒有對象

0

無法添加評論, 將此視爲對Jon Skeet的答覆的評論。

在Java中,Null = Null是true還是false。

更具體地說,應該如何處理Null = Null以及不同的語言如何處理這種情況?

0

做的最常見的方式是:

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非空。

0

出於性能原因,通常在執行任何其他邏輯之前檢查身份是很好的,正如問題中所做的那樣。但是,許多答案都沒有考慮到這一點。

把身份檢查的最佳位置是在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)); 
1

關於:

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); 
    } 
} 

讓我看看。

  • 如果爲空並且是B,則它的確定
  • 如果如果== B(同REF)由短路返回true
  • 如果沒有B A不爲空,然後(2dns部分的OR可能b爲空)然後返回一個(不爲空).equals(b)無論b是

Yeap被覆蓋。