2011-09-29 43 views
7

我目前正在創建一個大型項目,因此我希望儘可能提高所有工作的效率。Java - 對象引用或標識符?

在我的項目中,我有一個名爲Teams的類,它包含一個Team對象的HashMap(Integer,Team)。團隊的每個實例都有一個唯一的ID(整數)。

還有一個叫做Player的對象。玩家的每個實例都可以分配給一個團隊(但並非總是如此)。

現在,我想最好的辦法是瞭解隊伍的選手被分配到什麼:

- >存儲球隊在球員(私人詮釋團隊)的ID,這個ID然後使用從團隊中的HashMap獲取團隊。

- >存儲在播放器(私人車隊隊)

有誰知道這是更好的,什麼是最重要的親的,反對的和危險是每到Team的參考?

謝謝!

+1

這完全取決於你的用例。不要孤立地設計課程,而是嘗試設計垂直切片的特徵。 – leonm

回答

6

使用私團隊!除非有充分的理由,否則其他類不需要知道對象的ID。不要在Java中實現數據庫結構。 Java被設計爲基於對象的,以這種方式使用它。

有你應該保持團隊的實例幾個其他原因:

  1. 我們可以假設你的播放器將需要訪問團隊對象。有實例而不是查找是更好的選擇。
  2. 如果您持有ID而不是實例,則可能沒有任何對持有對象的引用,並且可能會進行垃圾回收。我知道你的情況可能不會發生,因爲你把所有的球隊都放在地圖上,但這仍然是一個風險,因此應該避免。
+0

感謝您的信息。我還有一個問題:對一個對象的引用需要多少內存? – Insdeath

+0

http://stackoverflow.com/questions/4474114/java-how-much-memory-a-reference-implies – stivlo

+0

非常感謝:) – Insdeath

-1

您使用數據庫嗎?如果是這樣,請將球隊的ID存儲在球員中,否則我建議您存儲球隊的參考。

+0

-1不同意。僅僅因爲在後臺有一個數據庫,並且表使用的是ID,所以沒有理由在對象中使用ID。有很多ORM解決方案(Hibernate)可以使這一切變得簡單。 –

+0

所以,我發現我之前說過的並不是那麼「正確」,而且,它依賴於... –

0

很顯然,在不知道使用環境的情況下,在某些情況下不可能說 - 但從代碼設計的角度來看,「自然」期望是一個團隊包含玩家,因此團隊會參考玩家反對,而不是相反。

如果你開始搞亂ID並需要存儲大量不同的對象,那聽起來就像你在更多的數據庫之後,在這種情況下,如果你不想走出去看看類似HSQLDB的東西的Java。

+0

我認爲它需要是雙向連接。球隊將擁有球員名單,球員將擁有球隊。我想要輕鬆確定一個球隊中有多少球員以及一名球員在哪個球隊上。 –

0

使用對象引用作爲HashMap(或任何Map)中的鍵的潛在危險是,如果做得不正確,它可能會成爲內存泄漏。

如果仍有引用,則不會垃圾收集對象。如果用作Map中的鍵,則認爲該鍵是對該對象的引用。您可以繞過這using WeakReference

在你描述的情況下,你可能應該使用對象作爲鍵,但要小心以上條件。

+0

不,我不使用引用作爲映射中的鍵 - 我只使用整數來標識對象,所以這不應該成爲問題。 – Insdeath

+0

啊我誤解了這個問題...提示:總是使用代碼示例。 ;-) –

0

private Team team是您提及的兩種方法之間的方法。如果你存儲了Id,如果HashMap被更新,會發生什麼?這是創造不必要的依賴。