Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 映射与合成_Java_Oop - Fatal编程技术网

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;
  }
}