2017-06-19 40 views
1

我需要存儲Map<Integer, User>以便按ID查找用戶。在使用Guice之前,我會創建一個UserManager,它自己將地圖組合起來,並有2個函數來獲取和設置用戶。正在Guice中使用單個綁定存儲整個地圖被認爲是不好的做法?

爲了避免需要一個單獨的(可能是poltergeist)包裝類,是否認爲創建類如UserMap extends HashMap<Integer, User>是不好的做法,並將其綁定到單例實例?然後,我可以直接注入UserMap本身,無需擔心任何事情。這可能會違背構成而不是繼承......但考慮到它的唯一目的是作爲一張地圖嗎?

是否有任何其他合適的方式來存儲Map(和其他)類型的全球訪問沒有靜態變量(即沒有靜態非Guice UserManager.get(23))?

我覺得我創建的幾十個「經理」類是沒有用的,只是提供了一個封裝到已有的函數。

回答

2

我會說擴展HashMap而不是自己的界面會違背最佳實踐。

這裏有幾個原因

  • 如果以後想通過ID從數據庫中獲取的用戶,你需要重寫觸及所有代碼這個Map
  • 使測試更容易
  • 給出的輕鬆概覽什麼操作允許

最好有一個明確的界面,它定義了可能增長的UserManager的責任m隨着您的應用程序的不斷髮展

+0

這是一個很好的觀點。我覺得,如果只有'返回userMap.get(param);'的單行函數 - 這也是我的兩難選擇,否則就會違背最佳實踐。 –

+1

@ThomasRyder不知道你爲什麼這麼認爲。您將它存儲在'HashMap'中是接口/類的用戶不必擔心的實現細節。 – jontro

+1

@ThomasRyder映射是非常通用的,這應該是一個足夠好的理由,您希望它被封裝在任何DI上下文中。如果您需要具有相同泛型的其他地圖,該怎麼辦?你會註釋,好的,但是這樣會更不可讀。同樣在Java 8中,大多數管理者方法現在都被縮減爲一個長串的流調用,使得它們在技術上只有1行。只要去包裝,你不會有任何不好的意外。 –

相關問題