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

标签 java class-diagram

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

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

希望有人能帮我弄清楚。

我指的所有循环都是纯循环,只有一种关系。

Q1:假设A类由B类组成,那么B类是否也可以由A类组成,假设A类和B类是不同的类?此外,组合关系是否可能具有循环?

Q2:类图中的其他关系,比如聚合、依赖、关联?这些关系中循环的含义是什么?谁能举一些例子?

感谢您阅读我的问题,希望有人可以帮助我。

最佳答案

Q1: Suppose class A is composed of class B, is it possible that class B is also composed of class A, given that class A and class B are different classes? Moreover, is it possible for composition relationship to have cycles?



严格来说,用 UML 术语...是的,但是您很难在代码中实际实现这一点。如果你问自己,“没有 A,B 能独立存在吗?” “没有B,A能独立存在吗?”如果您可以同时对这两个答案都回答“否”,那么您可以拥有两个彼此组成的类。由于一个人必须能够独立站立,另一个人才能由它组成,所以你不能同时拥有两者。但是,由于组合与聚合主要基于设计和上下文,因此并非完全不可能。例如,你可以有这样的东西:

类(class) 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

假设我们消除了 setMyB()来自 A 的方法并将其移至构造函数...我们将有一个无限循环的新对象,您最终会得到 StackOverflowError
您可能会发挥创意并尝试实现单例模式或其他限制创建对象数量的构造,但这样做意味着构造函数需要是私有(private)/隐藏的,这会阻止其他类的扩展。使用静态字段来跟踪创建的数量可能会防止错误,但是你会丢失所有的引用而没有一个地方来跟踪它们,最后,你永远不会有一个“完美”的组合,因为一类将缺少其组件。

在所有这些“分析”之后,您最终会提出一个有意义的设计,而不是严格符合 UML 图上绘制的设计。 UML 图用于传达类之间的“关系”。您在此处询问的“独特”案例 A 使用 B 而 B 使用 A 可能无法通过 UML 建模解决,但可能需要一些其他设计工作。

Q2: What about other relationship in the class diagram, like aggregation, dependence and association? What's the meaning of cycles in these relationships? Can anyone give some examples?



关联关系实际上用于描述由组合、聚合、多对多、一对一等定义的关系类型,并取决于上下文。每个关联中循环的含义将取决于您的设计。

通常,依赖项中的循环意味着该类依赖于自身。这可能用于递归函数调用、单例设计模式实现或其他一些需要类引用自身的设计模式。

聚合在上面已经得到了回答。它基本上意味着对象“使用”它聚合的任何东西。一个例子是 Company骨料 People .公司走了,人还在。这种关系中的循环类似于我的示例中显示的,除了您对 A 都有外部引用。和 B作为参数传递给 A 的前两个引用的类和 B .

底线是... UML 是一种显示类之间关系的工具。设计和实现将随之而来,而使用 UML 建模的“有趣”关系这一事实不会帮助您克服严重的设计障碍。

希望这有助于阐明您的问题。

关于java - 类图中的组合关系可以有循环吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26857527/

相关文章:

java - 如何从 MySQL 中检测空的结果集?

java - 设置迭代器的 Java 泛型

java - AssertJ:从提取列表中检索第一项返回列表

uml - 我不懂关联类——UML类图

c++ - 有没有办法获取 C++ 可执行文件中存在的类列表?

java - Brian Goetz 谈 'final' 关键字

java - 自定义渲染器后 JTable 列不可编辑

inheritance - JHipster继承

attributes - 在 UML 类图中使用 Association 或 List 属性?

java - 根据 API/UML,我的代码的结构/顺序是否正确?