[英]Aggregation and Composition Implementation in java using Class Diagram
我试图了解聚合和组成。
假设我有以下内容:
并且我想使用java来实现,下面的实现正确吗?
public class ClassC { private String z; }
public class ClassB {
private String y;
private ClassC classC;
//-----setter and getter for classC
}
public class ClassA {
private String x;
private List<ClassB> classBList;
public ClassA(final List<ClassB> classBList) {
this.classBList=classBList
}
}
另外,如何确保ClassB可以恰好具有1个ClassC?
并且ClassA可以有1个或多个ClassB? 如箭头所示(如果我正确理解了这些符号)。
我认为可能令人困惑的是组合和聚合之间的区别,因为两者都是“具有”关系的示例。 但是,组合比聚合更强大,包含对象控制着部分对象的整个生命周期。
您可以像做final那样用final编写它,但效果并不理想:
public class ClassA {
private String x;
private final List<ClassB> classBList;
public ClassA(String x, List<ClassB> classBList) {
this.classBList=classBList;
this.x = x;
}
}
我认为这将使表述更加清晰:
public class ClassA{
private String x;
private final List<ClassB> classBList;
public ClassA(String x){
this.x = x;
classBList = new ArrayList<ClassB>(2);
classBList.add(new ClassB(..........));
classBList.add(new ClassB(..........));
}
}
您可以以类图为例,通过这种方式对其进行建模。 对于ClassA,请执行mihaisimi的操作:在ClassA的构造函数中实例化ClassB的列表。 如果要确切确定给定ClassA实例应包含多少个ClassB实例,只需将一个整数参数添加到构造函数中,并在它为0时引发异常。然后将作为循环计数器传递的值用于Add方法。
对于ClassB,将参数添加到其ClassC类型的构造函数中。 因此,如下所示(java有点生锈,因此可以根据需要随时更正我的语法):
public class ClassA
{
public final List<ClassB> classBList;
public ClassA(int y){
this.myClassBList = x;
classBList = new ArrayList<ClassB>(y);
for(int i=0;i<y;i++)
{
classBList.add(new ClassB(new ClassC));
}
}
public class ClassB
{
public ClassC myClassCInstance;
public ClassB(ClassC myClassC)
{
myClassCInstance = myClassC;
}
}
如您所见,这使您可以将任意数量的ClassB实例与ClassA实例关联,并将它们的生存期与ClassA关联起来。 而且,如您所见,您不能向一个ClassB实例添加多个ClassC实例,并且ClassB的生存期并不严格地与ClassB关联。
因此,如何对组成和构造进行建模的基本区别在于:对于组成,在组成对象(带有菱形的对象)构造函数中实例化组成对象,对于聚合,将聚集对象作为参数传递给聚集对象的构造函数。
有许多实现这种类图的正确方法。
但是,为了选择正确的实现,您首先应该确保您了解UML中定义的关联,聚合和组合的概念。
我已经在我的网站上写了一篇关于该主题的文章: UML构成,聚合与关联
简而言之,组合是一种具有实际约束并影响发展的协会类型,而聚合纯粹是该协会性质的功能性指示,而没有技术影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.