Java 类图中的组合关系可以有循环吗?
我想为Java类图实现一个模型检查器 我已经考虑了一段时间了,有很多限制 希望有人能帮我弄清楚 这里所有的循环都是纯循环,只有一种关系 Q1:假设A类由B类组成,考虑到A类和B类是不同的类,B类也可能由A类组成吗?此外,组成关系是否可能存在循环 问题2:类图中的其他关系如何,比如聚合、依赖和关联?在这些关系中,周期的含义是什么?有人能举一些例子吗 谢谢你阅读我的问题,希望有人能帮助我 Q1:假设A类由B类组成,那么该类是否可能 B也由A类组成,因为A类和B类是 不同的班级?此外,是否有可能进行合成 关系有循环吗 严格地说在UML术语中。。。是的,但是你很难在代码中真正实现它。如果你问自己,“没有A,B能独立吗?”和“没有B,A能独立吗?”如果你能同时对这两个问题回答“不”,那么你可以有两个相互组成的类。因为一个必须能够独立站立,另一个才能由它组成,所以你不能两者兼而有之。然而,由于组合与聚合在很大程度上是基于设计和上下文的,所以这并非完全不可能。例如,您可以有如下内容: 类Java 类图中的组合关系可以有循环吗?,java,class-diagram,Java,Class Diagram,我想为Java类图实现一个模型检查器 我已经考虑了一段时间了,有很多限制 希望有人能帮我弄清楚 这里所有的循环都是纯循环,只有一种关系 Q1:假设A类由B类组成,考虑到A类和B类是不同的类,B类也可能由A类组成吗?此外,组成关系是否可能存在循环 问题2:类图中的其他关系如何,比如聚合、依赖和关联?在这些关系中,周期的含义是什么?有人能举一些例子吗 谢谢你阅读我的问题,希望有人能帮助我 Q1:假设A类由B类组成,那么该类是否可能 B也由A类组成,因为A类和B类是 不同的班级?此外,是否有可能进行合
B
包含对a
的引用,a
包含对B
public class A {
B myB;
String name = "A";
public A(int num) {
this.name += num;
}
public void setMyB(B b) {
this.myB = b;
}
public B getMyB() {
return this.myB;
}
public String getName() {
return this.name;
}
}
public class B {
A myA;
String name = "B";
public B(int num) {
this.name += num;
myA = new A(num);
}
public A getMyA() {
return this.myA;
}
public String getName() {
return this.name;
}
}
在本例中,我们使用定义的字符串
为类提供一个标识符,然后在其上附加一个数字,只是为了显示一些唯一的ID。
我们提供的方法允许我们访问A
和B
引用,但只有B
通过构造函数(组合)创建对另一个的引用
使用此简单测试:
public class Test {
public static void main(String[] args) {
A myA = new A(1);
B myB = new B(2);
B anotherB = new B(3);
myA.setMyB(anotherB);
System.out.println("A = " + myA.getName());
System.out.println("A's B = " + myA.getMyB().getName());
System.out.println("B = " + myB.getName());
System.out.println("B'a A = " + myB.getMyA().getName());
}
}
我们可以看到以下输出
A = A1
A's B = B3
B = B2
B'a A = A2
在本例中,A
中的B引用是在A
的上下文之外创建的,并作为参数传入。如果我们删除了myB
,我们将失去对其A
的引用,但如果我们删除了myA
(我们仍然有另一个b
)
假设我们从A
中删除了setMyB()
方法,并将其移动到构造函数中……我们将有一个无限循环的新对象,您将得到一个stackoverflowerr
您可能会变得有创意,尝试实现Singleton模式或其他限制创建对象数量的构造,但这样做意味着构造函数需要是私有/隐藏的,这会阻止其他类的扩展。使用静态字段跟踪创建数量可能会防止错误,但是你会丢失所有的引用,而没有一个地方来跟踪它们,最后,你永远不会有一个“完美”的组合,因为一个类会丢失它的组件
在所有这些“分析”之后,你最终会得到一个有意义的设计,而不是一个严格符合UML图的设计。UML图是用来传达类之间的“关系”的。“独特的”您在这里询问的A使用B和B使用A的情况可能不会用UML建模来解决,但可能需要一些其他的设计工作
问题2:类图中的其他关系如何,比如
聚合、依赖和关联?循环的含义是什么
在这些关系中,有人能举一些例子吗
关联关系实际上用于描述由组合、聚合、多对多、一对一等定义的关系类型,并取决于上下文。每个关联中周期的含义将取决于您的设计
一般来说,依赖项中的循环意味着类依赖于自身。这可能是用于递归函数调用、单例设计模式实现或其他要求类引用自身的设计模式
上面已经回答了聚合问题。它基本上意味着对象“使用”无论聚合的是什么。一个例子是a公司
聚合人
。当公司离开时,人仍然存在。这种关系中的循环类似于我的例子中所示的循环,只是你会对作为参数t传递的a
和B
类进行外部引用o对A
和B
的前两个引用
底线是…UML是一种显示类之间关系的工具。设计和实现将遵循这一点,而使用UML建模的“有趣”关系这一事实将无法帮助您克服严重的设计障碍
希望这有助于澄清您的问题。首先,禁止在类图中循环将不允许任何类型的递归数据结构。区分a和B是不同类的情况没有任何意义,因为我们讨论的是关系,引入了特殊情况(例如,A可以使用B,B可以使用A,因为B是A的值包装器)不是解决问题的正确方法。