如果我有两个具有一对一关系的类,何时是使用映射的好时机。映射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