2010-12-07 58 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; 
    } 
}