我想为Java类图实现模型检查器。
我已经考虑了很多限制因素。
希望任何人都能帮助我解决这个问题。
我所说的所有周期都是只有一种关系的纯循环。
Q1:假设A类由B类组成,B类是否也可能由A类组成,因为A类和B类是不同的类?此外,组合关系是否有可能具有循环?
Q2:类图中的其他关系如聚合,依赖和关联怎么样?这些关系中循环的含义是什么?谁能举一些例子?
感谢您阅读我的问题并希望有人可以帮助我。
答案 0 :(得分:1)
Q1:假设A类由B类组成,那么该类是否可能 鉴于A类和B类,B也由A类组成 不同的班级?而且,组合物是否可能 有周期的关系?
严格地说,用UML术语......是的,但你很难在代码中实际实现它。如果你问自己," 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;
}
}
在此示例中,我们使用已定义的String
为该类提供标识符,然后为其附加一个数字,以显示一些唯一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
(我们仍然有anotherB
,则不会。{/ p>
假设我们从setMyB()
中删除了A
方法并将其移至构造函数中...我们有一个无限循环的新对象,并且您最终会得到一个StackOverflowError
你可能会变得有创意并试图实现Singleton模式或一些限制创建的对象数量的其他构造,但这样做意味着构造函数需要是私有/隐藏的,这会阻止其他类的扩展。使用静态字段来跟踪创建的数量可能会阻止错误,但是如果没有地方跟踪它们,您将失去所有引用,最后,您永远不会有#&# 34;完美"组成,因为一个类会缺少它的组件。
毕竟这"分析"你最终会想出一个有意义的设计,而不是一个严格适合在UML图上绘制的设计。 UML图表用于传达"关系"课间。 "独特"如果您在这里询问A使用哪个B和B使用A可能不会通过UML建模解决,但可能需要其他一些设计工作。
Q2:类图中的其他关系怎么样,比如 聚合,依赖和关联?什么是周期的意义 在这些关系?谁能举一些例子?
关联关系实际上用于描述由组合,聚合,多对多,一对一等定义的关系类型,并且取决于上下文。每个关联中循环的含义取决于你的设计。
通常,依赖中的循环意味着类依赖于自身。这可以用于递归函数调用,Singleton设计模式实现,或者需要类引用自身的一些其他设计模式。
上面已经回答了聚合。它基本上意味着对象"使用"不管它是什么聚合的。一个示例是Company
聚合People
。当公司离开时,人们仍然存在。这种关系中的循环类似于我的示例中显示的循环,除了您对A
和B
类的外部引用,这些类作为前两个引用的参数传递到A
和B
。
底线是...... UML是一种显示类之间关系的工具。设计和实施将遵循这一点,并且事实上你有"有趣的"用UML建模的关系不会帮助你克服严重的设计障碍。
希望这有助于解释您的问题。