2009-09-22 64 views
5

我正在寫一個構成Java類的公共接口的一部分的方法。它廣泛地允許調用者指定要分配給多個數據庫實體的值 - 因此它們必須提供實體本身的ID以及要分配給它們的值。更好地使用一個列表對,或兩個列表?

我在執行這個作爲List<Pair<Integer, Integer>>或兩個List<Integer>參數之間搖擺不定。這兩個顯然工作,都不會導致我的方法中的任何實施或效率問題。在任何情況下基本上都是相同的信息(一個2xn數組),只是條紋不同。

因此,我想就您認爲哪個更好,以及爲什麼會提出一些意見。

優點我看到迄今對的列表:

  • 更準確地反映(如不匹配列表的長度)
實體之間的實際關係
  • 消除動態誤差的一些類

    這對清單的優點:

    • 不依賴於否正JDK類(簡單Pair是把握作爲一個概念)
    • 不需要任何輔助對象的建設只是攜帶
    • 來電者更可能有單獨列出的參數反正數據,因此他們不需要在調用方法前重新對齊數據

    這兩種情況具有相同的類型安全性,以及相同的參數不匹配的可能性(例如,當它應該是另一種方式時,首先輸入值,第二個輸入ID)。後一個問題可以通過在Integer周圍創建一個簡單的包裝來避免,稱爲PrimaryKey,它有其自己的優點和缺點,並且與此問題正交,因爲在兩種情況下都可以使用它。

    但是,有一箇中間地帶可以成爲第三個選項 - 一個普通的容器類,它具有objectId和value的整數字段。這不會使編譯器的幫助通過鍵入來確保對象是正確的,但它確實在作業中提供了額外的安全層。儘管如此,我不認爲我會這樣做,因爲我不喜歡這樣的一個小班級污染公共接口的想法。

  • 回答

    21

    我會強烈建議密切結合在一起的數據,可能爲一對,但更象是一個特定容器。這樣你可以隨意引入與這兩個對象相關的額外功能。

    保持兩個分開的列表將會是一個痛苦。你必須將兩者都通過並保持同步。爲此創建一個新對象的開銷是微不足道的,而且正是OOP的設計目標(您只需通過爲您的應用程序編寫新的Java代碼來創建非JDK類,請不要忘記)。

    我一直創建這樣的小類。他們執行強大的類型安全並提供增強和重構的範圍。 IDE可以更容易地識別和執行重構。

    +0

    關於面向對象和重構選項的所有優點 - 謝謝。 – 2009-09-22 10:04:37

    +0

    作爲額外的好處 - 如果你有成對的成員列表,你可以根據需要輕鬆製作出三元組列表。要求改變,你知道。 – 2009-09-22 13:51:38

    +0

    這就是爲什麼我主張不明確使用Pair對象:-) – 2009-09-22 15:52:20

    2

    當API公開時,請確保您只是實現了核心功能,因爲您提供給客戶端的所有內容都無法收回。

    想想只有2個參數assign(Integer entityId,Integer someOtherId)的方法,讓客戶端弄清楚如何添加更多的項目。

    如果你想允許方便的訪問給他們一個util類,它帶有一個接口「Assignment」,它只是定義了getEntityId()和getSomeOtherId()以及像DefaultAssignment這樣的默認實現,它保存對id的最終引用。

    然後,您的客戶可以選擇他們想要去的方式,而且您不必確保支持您的「配對」課程。

    +0

    關於接口的好處,這似乎與Brian Agnew的回答有類似的結論。對象的一切! :-) – 2009-09-22 10:07:27

    +0

    確切的祝你好運。 – MrWhite 2009-09-23 17:42:35

    5

    我覺得你所經歷的分析已經很好地確定了這兩種方法的優缺點。

    我也瘦朝使用Pair類,理由是你已經列出的優點:

    • 更準確地反映了實體之間
    • 實際 關係消除了動態 一些類錯誤(例如,列表長度不匹配)

    對我來說最重要的一個就是頂級。

    總是寫代碼來說明意圖。不要僅僅考慮實現而編寫代碼。

    使用類如Pair表明有一對值表示一個ID和實際實體本身的意圖。它還表明一個對象是需要一起處理的一個獨立的數據單元 - 不能通過具有兩個單獨的ID和實體的List來進行處理。

    +0

    +1對於粗體部分尤其如此 - 經過反思,客戶以我的方法真正使用它們的形式收集參數是有意義的。 – 2009-09-22 10:05:48

    0

    在我看來,去配對(或您自己的更具體的容器)列表,因爲這似乎是最自然地反映了你正在解決的問題。只有一個變量需要跟蹤,併發送給方法,而不是兩個。

    2

    如果兩個整數真的屬於一起並且應該表示「一件事」,那麼我會去找ListPair s。

    使用兩個單獨的列表的另一個缺點是,如果列表總是相同的大小,編譯器不檢查你。你將解釋留給你的方法的客戶;客戶端需要匹配兩個列表中的元素。

    正如您所說,我不認爲使用像Pair這樣的類是一個很大的缺點,因爲它依賴於非JDK類,但如果您真的不想使用類似Pair之類的東西,甚至可以使其成爲數組列表:List<Integer[]>,其中每個數組包含兩個Integer對象。 (在我看來,這比使用Pair醜)。

    5

    爲什麼不去用字典(地圖類型,無論Java如何稱它現在,我認爲它曾經是Hashtable)?這會將ID映射到值並回避你的困境。

    +0

    +1好點 - 我很驚訝,我沒有想到這一點。它準確地映射了這兩件事之間的關係以及任何其他建議。 – 2009-09-22 10:08:36

    +0

    腳本語言的背景可能會有所幫助。有一箇舊的Perl(雅克!)格言:如果你不是在思考哈希(字典),你不是在考慮Perl ... – 2009-09-22 11:31:06

    2

    成對列表方法顯然是要做的事情,因爲它更準確地反映了意圖 - 但是如果這些ID是唯一的,Map可能會更好。

    如果你有百萬這些對的,和內存消耗成爲主要考慮,你可能想切換到對 - 的 - 名單(因爲會有每雙少了一個對象)。

    0

    去與對列表或地圖。

    我不買任何你列出的「con」參數。

    你應該總是在更大的抽象方面犯錯。你正在編寫一個面向對象的語言,在我看來,封裝和信息隱藏是在對象中思考的最重要原因。它隱藏了用戶的實現細節,讓他們專注於您的課程提供的內容。他們可以忘記你的班級如何完成他們想要的。強迫你的客戶維護兩份名單是要求他們知道更多的信息。

    0

    先寫單元測試。然後,您可以輕鬆查看最容易使用的內容,然後選擇它作爲您的實施。

    +0

    -1這可能是真的,但與問題無關。 – finnw 2009-09-22 11:17:06

    +0

    他問意見是什麼更好。最好的是他喜歡與之合作的那個! – 2009-09-22 13:23:53

    0

    您可能會考慮將參數設置爲Iterator<Pair>。如果調用類有一個List<Pair>,獲取迭代器是微不足道的。如果沒有,創建迭代器可能更容易構建,更快和/或更自然。在某些情況下,它甚至可以幫助您消除內存不足的問題。

    1

    我這個點半不以爲然:

    • 不依賴於任何非JDK類(簡單對被掌握作爲一個概念)

    ,因爲雖然沒有Pair在JDK中有一個類,它有一個接口:Map.Entry,它適合你的用途,作爲一個鍵/值關聯。

    相關問題