UML图中的私有嵌套Java类

25

我有一个关于UML的问题。我有一个类,其中包含一个使用私有访问修饰符的内部类 - 无法从其他地方访问...一般来说,为了表示内部类关系,我可以像这里的(InnerOddIterator)那样使用一个(+)关系:

enter image description here

(取自http://www.uml-diagrams.org/nested-classifier.html

我没有找到任何关于如何清晰强调这个类是私有的信息。您知道是否存在这样的方法吗?如果是,能否给我提供一些链接或其他东西?

仅为了保持清晰,以下是示例代码:

public class DataStrucure {
     // fields, methods, etc
     private class InnerOddIterator{
          // ... 
     };
}

请参见http://www.uml-diagrams.org/package-diagrams.html#package-import中的“私有导入”。 - xmojmr
如果你觉得清楚地强调这个类的私有性很重要,考虑使用<<private>>之类的构造型。你只需要记录下你的构造型意义,就完成了。构造型是扩展UML规范的“官方”方式,有时人们忽视的一点是任何人都可以用它们来随意扩展UML。一些构造型(例如"<<abstract>>")已经成为普遍使用的构造型,并不会改变这个事实。 - BobRodes
2
请查看此帖子以获取更多最新信息。 - BobRodes
3个回答

8

从UML的角度来看,如果分类器(也包括类)嵌套在其他类中,则嵌套类所在的类起到命名空间的作用。在这种情况下,嵌套类在上下文命名空间中是隐藏的(私有的)。这意味着,您的图表隐含地定义了私有内部类的定义。

以下是来自UML超级结构部分“结构化分类器”一节的定义摘录:

“一个类充当其范围内定义的各种分类器(包括类)的命名空间,嵌套分类器会将分类器的可见性限制在包含类的命名空间范围内,并用于信息隐藏的原因。嵌套分类器与包含类中的任何其他分类器一样使用。”


我已经更深入地研究了这个问题。OP图表中的“anchor”符号在1.4中有规定,但在2.x中没有。我对命名空间元模型进行了一些分析,看起来应该在包含类上放置一个命名空间属性,在包含类的关联端上放置组合钻石,并在嵌套类端上放置“{subsets namespace}”属性。子集属性实现了引用所描述的可见性。请参阅此处获取更多信息。 - BobRodes
“圆圈加号”符号在 UML 2.* 中仍然有效。UML 2.5.1 规范的第7.4.4.1节指出:符合规范的工具可以选择性地允许在子条款12.2.4中定义的“圆圈加号”符号,用于显示包成员关系,也可用于显示其他类型的命名空间成员关系(例如,用于显示嵌套分类器)。 - www.admiraalit.nl

7
首先:您的代码中有内容并要求 UML 表示。但是,在我看来,您应该从另一个角度考虑:如何将那个 UML 想法表示为代码(某些编程语言甚至不提供私有嵌套类…)。
至于私有嵌套类:建议使用组合。它比关联更强,但不如继承强。而且由组成的类不能没有其组成者存在。非常像一个私有嵌套类。
图示取自http://www.uml-diagrams.org/association.htmlenter image description here

2
有些编程语言甚至不提供私有嵌套类——这是个好观点,对吧……我已经添加了Java标签以更具体化。 - radekEm
在Java中,如果在一个实例内部的嵌套内部类中,您可以使用“this”来访问外部实例 - 它们最终是绑定在一起的 - 它不能没有外部实例存在。正如我所说,这确实是一种组合。 - Martin Meeser
顺便说一下,在C#中并不是这样的 - 没有自动绑定到外部实例... - Martin Meeser
@MartinMeeser,我同意你的逻辑,并且我点赞了你的回答。然而,请注意并非所有软件开发社区的人都认为像你和我一样只有通过私有嵌套类才能实现组合。 - hfontanez

2
为了表示你的内部类是私有的,对我来说,最好的方法是使用如下所示的-字符,但在这种情况下,你会错过内部类的内部结构。 enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接