2014-07-04 35 views
0

在我工作的其中一個應用程序中,我發現他們正在考慮使用null id的兩個對象是不同的,這是java中equals()方法的正確行爲嗎?具有空ID的對象是相同的?

示例實現是如下::

public boolean equals(Object obj) { 
if (this == obj) { 
      return true; 
     } 
     if (obj != null && obj instanceof A) { 
      A a = (A) obj; 
      // If the id is null then its considered as different object. 
      if (a.getId() != null && a.getId().equals(this.getId())) { 
       return true; 
      } else { 
       return false; 
      } 
     } else { 
      return false; 
     } 
} 
+2

這是一個應用程序級別的決定。這是一個可能的實現 - 它取決於你想要達到的目標。 (我將它寫爲'return a.getId()!= null && a.getId()。equals(this.getId())'' –

+0

另外,寫'obj!= null && obj instanceof A'因爲'instanceof'在第一個參數爲空時返回'false' –

+0

thanx Jon Skeet你的答案似乎更容易理解 –

回答

0

這種事情最可能的應用是這些是插入數據庫並從數據庫中選擇的對象。通常,在插入時,數據庫會分配一個ID。

這意味着如果您擁有帶ID的對象,它們就位於數據庫中。如果兩個對象具有相同的ID,則它們都代表數據庫中的同一行。

但是,如果對象沒有ID,那麼您已經創建了它們,但是您尚未將它們插入到數據庫中。如果您有兩個這樣的對象,都沒有ID,那麼這些對象最終會以數據庫中的兩個不同行結束。但現在,它們只存在於您的應用程序中。儘管如此,如果它們是兩個不同的對象,那麼它們確實代表兩個不同的數據項 - 因此equals應該爲這兩個對象返回false。

0

閱讀這個問題的方法:從傳入對象空ID使得這兩個對象不相等。這似乎是一個直截了當的理由;我不能說沒有什麼東西是平等的。

(哦,順便說一句:在equals實現真正搗毀它需要在其他物體obj路過它會工作之前。)

+0

對不起,我的手動編輯..將更新我的問題 –

+0

仍然破碎 - 需要是一個'對象'類型的參數,最好命名爲'obj'(因爲這是你的代碼中已有的約定)。 – Makoto

+0

@Makoto我認爲'a'參數是一個錯字,並編輯它... – ajb

0

這是完全正常的,但它可能是錯誤的。這將意味着,對於b = a.clone()a.equals(b) == true將取決於ID是否爲空或不改變...的equals

規則是非常a.equals(b) == b.equals(a)

不過要小心,因爲你的方法實際上並不是覆蓋equals(Object),而是定義了一種不同的方法(我認爲這只是一個問題,而錯字雖然)。

+0

對不起,我的錯誤,更新了我的問題。 –

+0

@ user3679652仍不完全正確;現在它是一個過載,而不是一個覆蓋。 – awksp

相關問題