如果我有兩個具有一對一關係的類,何時是使用映射的好時機。映射vs合成
class A { ... }
class B { ... }
class C {
Map<A,B> a2b;
}
什麼時候使用組合?
class A {
B myB;
}
class B { ... }
如果關係是一對多和多對多,答案會改變嗎?
如果我有兩個具有一對一關係的類,何時是使用映射的好時機。映射vs合成
class A { ... }
class B { ... }
class C {
Map<A,B> a2b;
}
什麼時候使用組合?
class A {
B myB;
}
class B { ... }
如果關係是一對多和多對多,答案會改變嗎?
這取決於在整個項目中使用這種A
到B
關係的程度。
如果項目的許多不同領域需要知道與A
相關的B
,那麼最好如果這只是A
對象的一部分。另一方面,如果該關聯只在項目的一部分中使用,則應該在該項目的該部分中創建HashMap
以存儲關係。
如果這個答案是一對多或多對多的關係,這個答案不會改變。
使用Map
會增加整個事情的複雜性。
這是因爲在你的例子中的兩個類中的一個(A
)擁有其他的,這是真的無論是成分(因爲你需要的A
檢索其B
)無論是對映射(因爲你需要的關鍵A
,價值B
)。
所以,如果沒有明確的需要使用地圖,只是避免它。
對於案例1:N,M:N,您應該始終考慮需要對對象執行哪種操作,因爲擁有僅管理A
和B
之間映射的第三個對象並不是真的OO解決方案,你可以使用組合。
一對多可以用List<B>
在A
內建模,而多對多是映射可能是好的唯一情況,因爲否則您將不得不探索這兩個對象以瞭解它們的映射。
不久:如果你從A
角度訪問數據(A
擁有B
),那麼你並不需要有一個外部的映射,否則你會,但它應該是雙向的(二包含HashMap)。
該地圖非常適合多對多關係(如數據庫設計中的連接表)。只要你的一對一或一對多關係不需要特殊的屬性,沒有必要使用第三類(這第三類可以模擬關係本身)。
建立關聯,也許是雙向一個,如果你需要從兩個方向看:
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;
}
}
A擁有的組成例B,但而不是映射。如果解決方案需要它,Map不會增加複雜性。也沒有什麼可以說第三個對象只管理映射。這是一個普遍的設計問題 - 不要過多考慮這些例子的細節,這些例子一開始就相當普遍。只有在設計需要時才應使用雙向映射。 – 2010-12-07 15:56:52
這就是我說的,它增加了不必要的複雜性,如果你不真的需要使用它,這取決於所涉及的具體問題的設計。在任何情況下擁有B還以映射例子,因爲你無法檢索與它相關的B對象的一個目的,你需要2名映射到管理兩個方向(`地圖 a2b`和'與所有地圖 b2a`根據業務) – Jack 2010-12-07 16:00:41
您的評論假設比OO更「數據庫驅動」的方法。一個特定的映射對象應該在真正需要的時候使用,否則這只是浪費分配和時間,你可以避免在90%的時間內使用它。 – Jack 2010-12-07 16:04:00