Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类图中的组合关系可以有循环吗?_Java_Class Diagram - Fatal编程技术网

Java 类图中的组合关系可以有循环吗?

Java 类图中的组合关系可以有循环吗?,java,class-diagram,Java,Class Diagram,我想为Java类图实现一个模型检查器 我已经考虑了一段时间了,有很多限制 希望有人能帮我弄清楚 这里所有的循环都是纯循环,只有一种关系 Q1:假设A类由B类组成,考虑到A类和B类是不同的类,B类也可能由A类组成吗?此外,组成关系是否可能存在循环 问题2:类图中的其他关系如何,比如聚合、依赖和关联?在这些关系中,周期的含义是什么?有人能举一些例子吗 谢谢你阅读我的问题,希望有人能帮助我 Q1:假设A类由B类组成,那么该类是否可能 B也由A类组成,因为A类和B类是 不同的班级?此外,是否有可能进行合

我想为Java类图实现一个模型检查器

我已经考虑了一段时间了,有很多限制

希望有人能帮我弄清楚

这里所有的循环都是纯循环,只有一种关系

Q1:假设A类由B类组成,考虑到A类和B类是不同的类,B类也可能由A类组成吗?此外,组成关系是否可能存在循环

问题2:类图中的其他关系如何,比如聚合、依赖和关联?在这些关系中,周期的含义是什么?有人能举一些例子吗

谢谢你阅读我的问题,希望有人能帮助我

Q1:假设A类由B类组成,那么该类是否可能 B也由A类组成,因为A类和B类是 不同的班级?此外,是否有可能进行合成 关系有循环吗

严格地说在UML术语中。。。是的,但是你很难在代码中真正实现它。如果你问自己,“没有A,B能独立吗?”和“没有B,A能独立吗?”如果你能同时对这两个问题回答“不”,那么你可以有两个相互组成的类。因为一个必须能够独立站立,另一个才能由它组成,所以你不能两者兼而有之。然而,由于组合与聚合在很大程度上是基于设计和上下文的,所以这并非完全不可能。例如,您可以有如下内容:

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的值包装器)不是解决问题的正确方法。