利用类图在java中实现聚合和合成

利用类图在java中实现聚合和合成,java,uml,aggregation,composition,class-diagram,Java,Uml,Aggregation,Composition,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;

我正在努力理解聚合和组合。
假设我有如下内容:

我想用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
   }
}  
public类ClassC{private String z;}
公共类B{
私有字符串y;
私人c类;
//-----C类的setter和getter
}   
甲级公共课{
私有字符串x;
私有列表类列表;
公共类别A(最终列表类别列表){
this.classBList=classBList
}
}  
另外,如何确保ClassB可以正好有一个ClassC?

ClassA可以有一个或多个ClassB?如箭头所示(如果我正确理解这些符号)。

我认为可能令人困惑的是合成和聚合之间的区别,因为两者都是“has a”关系的样本。 但是,合成比聚合更强大,包含对象控制零件对象的整个生命周期

你可以像以前那样用期末考试来写,但它并没有达到目的:

public class ClassA {
   private String x;
   private final List<ClassB> classBList;
   public ClassA(String x, List<ClassB> classBList) {
      this.classBList=classBList;
      this.x = x;
   }
}  
公共类ClassA{
私有字符串x;
私人最终名单;
公共类A(字符串x,列表类列表){
this.classBList=classBList;
这个.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{
私有字符串x;
私人最终名单;
公共类A(字符串x){
这个.x=x;
classBList=新阵列列表(2);
添加(新的B类(……);
添加(新的B类(……);
}
}

您可以以类图为例,通过这种方式对其进行建模。对于ClassA,像mihaisimi一样:在ClassA的构造函数中实例化ClassB的列表。如果您想确定一个给定的ClassA实例应该包含多少个ClassB实例,只需向构造函数添加一个整数参数,如果是0,则抛出一个异常。然后使用作为Add方法的循环计数器传递的值

对于ClassB,向其ClassC类型的构造函数添加一个参数。所以,类似这样的东西(java有点生疏,所以可以根据需要修改我的语法):

公共类ClassA
{
公开最终名单类别列表;
公共类别A(int y){
this.myClassBList=x;
classBList=新阵列列表(y);

对于(inti=0;i,有许多正确的方法来实现这样的类图

但是为了选择正确的实现,您应该首先确保您理解UML中定义的关联、聚合和组合的概念

我在我的网站上写了一篇关于这一点的文章:

简言之,组合是一种对发展具有实际制约和影响的关联,而聚合纯粹是对关联性质的功能指示,没有技术影响


嗨,mihaisimi!我也浏览了链接,但是我理解正确了吗?上面的示例是从类图实现它的正确方法吗?我理解聚合和组合之间的基本原理和区别,但是从上面的类图和箭头上的数字实现中,我有点困惑将是0或1Ah,我当时感到困惑:)。好吧,如果你想确保一个参数被实例化,你可以总是将它标记为final。这将迫使你在内联或构造函数中实例化它,因此它不能再是0,并将满足1->1。例如,在classB中更改为“private final ClassC”。
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;
    }
}