2010-12-07 84 views
2

如果我有兩個具有一對一關係的類,何時是使用映射的好時機。映射vs合成

class A { ... } 
class B { ... } 
class C { 
    Map<A,B> a2b; 
} 

什麼時候使用組合?

class A { 
    B myB; 
} 
class B { ... } 

如果關係是一對多和多對多,答案會改變嗎?

回答

1

這取決於在整個項目中使用這種AB關係的程度。

如果項目的許多不同領域需要知道與A相關的B,那麼最好如果這只是A對象的一部分。另一方面,如果該關聯只在項目的一部分中使用,則應該在該項目的該部分中創建HashMap以存儲關係。

如果這個答案是一對多或多對多的關係,這個答案不會改變。

1

使用Map會增加整個事情的複雜性。

這是因爲在你的例子中的兩個類中的一個(A擁有其他的,這是真的無論是成分(因爲你需要的A檢索其B)無論是對映射(因爲你需要的關鍵A,價值B)。

所以,如果沒有明確的需要使用地圖,只是避免它。

對於案例1:N,M:N,您應該始終考慮需要對對象執行哪種操作,因爲擁有僅管理AB之間映射的第三個對象並不是真的OO解決方案,你可以使用組合。

一對多可以用List<B>A內建模,而多對多是映射可能是好的唯一情況,因爲否則您將不得不探索這兩個對象以瞭解它們的映射。

不久:如果你從A角度訪問數據(A擁有B),那麼你並不需要有一個外部的映射,否則你會,但它應該是雙向的(二包含HashMap)。

+0

A擁有的組成例B,但而不是映射。如果解決方案需要它,Map不會增加複雜性。也沒有什麼可以說第三個對象只管理映射。這是一個普遍的設計問題 - 不要過多考慮這些例子的細節,這些例子一開始就相當普遍。只有在設計需要時才應使用雙向映射。 – 2010-12-07 15:56:52

+0

這就是我說的,它增加了不必要的複雜性,如果你不真的需要使用它,這取決於所涉及的具體問題的設計。在任何情況下擁有B還以映射例子,因爲你無法檢索與它相關的B對象的一個​​目的,你需要2名映射到管理兩個方向(`地圖 a2b`和'與所有地圖 b2a`根據業務) – Jack 2010-12-07 16:00:41

+0

您的評論假設比OO更「數據庫驅動」的方法。一個特定的映射對象應該在真正需要的時候使用,否則這只是浪費分配和時間,你可以避免在90%的時間內使用它。 – Jack 2010-12-07 16:04:00

0

該地圖非常適合多對多關係(如數據庫設計中的連接表)。只要你的一對一一對多關係不需要特殊的屬性,沒有必要使用第三類(這第三類可以模擬關係本身)。

建立關聯,也許是雙向一個,如果你需要從兩個方向看:


public class A { 
    private B b; 
    public A(B b){ 
    this.b = b; 
    b.setA(this); // for bi-directional association 
    } 
} 

public class B { 
    private A a; 
    public B(){}; 
    public void setA(A a) { 
    this.a=a; 
    } 
}