java - 单向/双向 X 一/多 X 多/一关联关系

标签 java associations uml

以下问题也指以下问题中的讨论 https://stackoverflow.com/search?page=2&tab=Relevance&q=one%20to%20many%20unidirectional%20java

Best practise for adding a bidirectional relation in OO model

我尝试在Java中实现[单向/双向] X [(一个/多个)到(一个/多个)]形成的8种关联组合。我发现两种情况无法实现,即单向一对一和单向一对多(例如Person->*Vehicle)。其他 6 种组合和组合可以通过编程实现。

我觉得不仅仅是Java有这种情况,这两种情况都不存在。例如用例 - 如果我们知道该号码没有分配给其他任何人,则可以将一个 Aadhar/SSN 号码仅分配给一个人(必须进行反向导航)。这是否意味着我们在制作设计模型时需要小心,不要得出这些特定的关联(尽管它们可能存在于分析模型中)?我对此很困惑。

最佳答案

基本(无聚合)

如果您正在研究基本的单向关联,那么这是最简单的。

Unidirectional One to One

enter image description here

class Person {
    String name;
}

Unidirectional One to Many

enter image description here

class Person {
    List vehicles;
}

复合聚合

如果我假设您询问的是复合关系(其中一个 SSN 最多可以分配给一个人),那么您仍然可以实现它。

enter image description here

您决定如何实现它取决于您的特定领域或例如您如何存储数据,因为

reverse navigation is must

实际上不是真的,因为你可以只检查所有 Person 实例;或者您可以将所有 SSN 存储在智能数据结构中,该结构允许您快速检查新的 SSN 是否唯一,然后将其分配给该人员而无需额外检查,因为您已经知道它是唯一的。

或者您也可以实现相反的查找,即使关联是“单向”的,也不会禁止这种查找

引用UML Specs (11.5.3.1 关联)[强调我的]:

Navigability means that instances participating in links at runtime (instances of an Association) can be accessed efficiently from instances at the other ends of the Association. The precise mechanism by which such efficient access is achieved is implementation specific. If an end is not navigable, access from the other ends may or may not be possible, and if it is, it might not be efficient.

<小时/>

评论更新

没有人声称必须在访问器中维护关系约束。事实上,你几乎总会有暂时无效的关系,想象一下:

person = new Person();
// right now person is invalid state because it doesn't have an SSN
ssn = ssnGenerator.createNew();
// now ssn is also in invalid state because it has no person
person.setSSN(ssn);
// only now is person and ssn valid

(创建构造函数没有帮助,因为构造函数是在创建对象之后调用的(因此构造函数的另一部分可能需要已设置的 ssn)。

因此,程序员有责任确保系统以最有意义的方式支持所有约束。在某些情况下,使用构造函数/访问器是最简单的方法,但您可以例如将上面的代码包装在原子事务中。毕竟,如果您将验证保留在 setSSN() 中,那么如果程序员根本忘记调用该方法会发生什么?

(person 1->* vehicle) p1.add(v1) and p2.add(v1) are possible violations

您询问了“人 ->* 车辆”,现在您已将其更改为“人 1 -> * 车辆”,因此显然答案有所不同。但与上述相同的原则也适用 - 系统有责任维护所有约束,并且无论在访问器、验证方法或系统构造方式中完成的任何地方都是实现细节 - 没有单一的最佳方法,并且总会有权衡。

关于java - 单向/双向 X 一/多 X 多/一关联关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45187206/

相关文章:

java - xpath 不接受这个表达式

java - 有什么简单的方法可以将字符串从 JavaEE 后端推送到 Javascript 客户端吗?

ruby-on-rails - Rails 在父级没有子级时创建默认子级,而在父级有子级时不显示它

java - 为 Android 应用程序创建类图

java - @OneToMany 关联加入错误的字段

java - 编译运行时是否需要指定间接导入的包?

java - 存储项目到项目关联的算法

r - R中的Apriori算法,不是否定规则

c++ - 用于模板继承的UML图

class - 有两个由 1 :1 cardinality? 相关的类是否有意义