映射与组合

时间:2010-12-07 14:55:06

标签: java oop

如果我有两个一对一关系的类,那么现在是使用映射的好时机。

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

何时是使用作文的好时机?

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

如果关系是一对多和多对多,答案会改变吗?

3 个答案:

答案 0 :(得分:1)

使用Map会增加整个事情的复杂性。

这是因为在你的例子中,两个类中的一个(A拥有另一个,这对于组合来说都是正确的(因为你需要A来检索它B)要么用于映射(因为您需要值为A的密钥B)。

因此,如果没有明确需要使用地图,那就避免使用它。

对于案例1:N,M:N,您应该始终考虑需要对对象执行何种操作,因为有第三个对象只管理A和{{之间的映射1}}不是真正的OO解决方案,你可以使用合成。

一对多可以使用B内的List<B>进行建模,而多对多是唯一一种映射可能很好的情况,因为否则您将不得不探索这两个对象都是为了理解它们的映射。

很快:如果你将从A角度(A拥有A)访问数据,那么你不需要有外部映射,否则你会,但它应该是双向的(两个哈希图)。

答案 1 :(得分:1)

这取决于整个项目中AB关系的使用范围。

如果项目的许多不同区域需要知道与B相关联的A,那么最好将其作为A对象的一部分。另一方面,如果此关联仅用于项目的一个部分,那么您应该在项目的该部分中创建HashMap来存储关系。

如果这是一对多或多对多的关系,这个答案不会改变。

答案 2 :(得分: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;
  }
}
相关问题