Java 映射与合成
如果我有两个具有一对一关系的类,那么何时是使用映射的好时机Java 映射与合成,java,oop,Java,Oop,如果我有两个具有一对一关系的类,那么何时是使用映射的好时机 class A { ... } class B { ... } class C { Map<A,B> a2b; } 如果关系是一对多和多对多,答案会改变吗?使用地图将增加整个事情的复杂性 这是因为在您的示例中,两个类(A)中的一个拥有另一个,对于组合(因为您需要A来检索其B)或者映射(因为您需要A键来获取值B) 因此,如果没有明确的需要使用地图,就避免使用它 对于1:n,m:n,你应该总是考虑在对象上需要做什么样
class A { ... }
class B { ... }
class C {
Map<A,B> a2b;
}
如果关系是一对多和多对多,答案会改变吗?使用
地图将增加整个事情的复杂性
这是因为在您的示例中,两个类(A
)中的一个拥有另一个,对于组合(因为您需要A
来检索其B
)或者映射(因为您需要A
键来获取值B
)
因此,如果没有明确的需要使用地图,就避免使用它
对于1:n,m:n,你应该总是考虑在对象上需要做什么样的操作,因为有一个第三对象只管理<代码> a < /> >和<代码> b>代码>不是一个真正的面向对象的解决方案,你可以使用构图。
一对多可以用
a
内部的List
来建模,而多对多是唯一一种拥有映射的情况,因为否则您必须探索这两个对象才能理解它们的映射
简而言之:如果您将从a
角度(a
拥有B
)访问数据,那么您不需要外部映射,否则您将需要外部映射,但它应该是双向的(两个哈希映射)。这取决于a
到B
关系在整个项目中使用的广泛程度
如果项目的许多不同领域需要知道与A
相关的B
,那么最好只知道这是A
对象的一部分。另一方面,如果此关联仅在项目的一部分中使用,则应在该部分中创建HashMap
,以存储关系
如果是一对多或多对多关系,这个答案不会改变。该映射适用于多对多关系(如数据库设计中的联接表)。只要您的一对一或一对多关系不需要特殊属性,就不需要使用第三类(第三类将对关系本身进行建模)
如果您需要从两个方向观察,则建立一个关联,可能是双向关联:
在合成示例中,A拥有B,但不拥有映射。如果解决方案需要,映射不会增加复杂性。第三个对象只管理映射也没有什么可说的。这是一个一般性的设计问题——不要过多地关注示例的细节,因为这些示例从一开始就非常一般。双向映射只有在设计需要时才应该使用。这就是我所说的,如果你真的不需要使用它,它会增加不必要的复杂性,这取决于所涉及的特定问题的设计。在任何情况下,在映射示例中,A也拥有B,因为您无法检索带有关联B对象的A对象,您需要两个映射来管理两个方向(Map a2b
和Map b2a
,以及所有相应的操作)。您的注释采用了比OO更“数据库驱动”的方法。应该在真正需要的时候使用特定的映射对象,否则只会浪费分配和时间,您肯定可以避免90%的时间使用它。A
在映射示例中不拥有B
。在HashMap
中,两个对象都不需要相互了解,就可以将它们用作键值对。这是HashMap
功能的一部分。是的,我不是在说OOP中数据库关系或组合中的“拥有”概念。。这不是一个概念性的模式,而是一个实际的模式。这不是我经常使用的双向关联模式。事实上,我尽可能地避免它。我喜欢我的类在本质上是分层的,所以如果一个类知道另一个,那么这个类就不知道第一个。我发现很少有例子需要违反这一点。+1清晰简洁,谢谢!如果将来这种关系可能会被删除,那么映射可能会更好,对吗?如果您现在知道这种关系只是暂时的,那将是一个倾向于映射解决方案的好理由。
class A {
B myB;
}
class B { ... }
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;
}
}