利用类图在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;
}
}