以下问题也涉及以下问题的讨论 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个关联组合。我发现无法实现两种情况,即单向一对一和单向一对多(例如,人 - > *车辆)。其他6种组合和组合物可以以编程方式进行。
我感觉它不仅仅是Java的情况,这两种情况不存在。例如使用案例 - 如果我们知道该号码未分配给任何其他人,则只能为一个人分配一个Aadhar / SSN号码(必须使用反向导航)。这是否意味着我们需要注意,同时使我们的设计模型不会达到这些特定的关联(尽管它们可能存在于分析模型中)?我很困惑。
答案 0 :(得分:1)
如果您正在查看基本的单向关联,那么这是最简单的一种。
单向一对一
class Person {
String name;
}
单向一对多
class Person {
List vehicles;
}
如果我假设您在询问复合关系(其中一个SSN最多可以分配给一个人),那么您仍然可以实现它。
然而,您决定如何实施它取决于您的特定域名,例如如何存储数据,因为
反向导航必须
实际上并不正确,因为您可以只检查所有Person实例;或者您可以将所有SSN存储在智能数据结构中,以便您快速检查新的SSN是否唯一,然后将其分配给Person而无需额外检查,因为您已经知道它是唯一的。) p>
或者您也可以实现相反的查找,即使关联是“单向”也不会被禁止
引用UML Specs(11.5.3.1协会)[强调我的]:
导航性意味着在运行时(协会的实例)参与链接的实例可以是 从协会另一端的实例有效访问。这种有效的精确机制 访问是实现特定的。 如果结尾不可导航,访问来自其他目的可能或者可能 可能,如果是,可能效率不高。
没有人声称维护关系限制必须在访问者中完成。事实上,你几乎总是会暂时无效的关系,想象一下:
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()中保留了验证,那么如果程序员忘记调用该方法会发生什么呢?
(人1-> *车辆) p1.add(v1)和p2.add(v1)可能违规
你问过“人 - > *车辆”,现在你把它改成了“人1 - > *车辆”,所以很明显答案有所不同。但是同样的原则也适用 - 系统有责任维护所有约束,无论在访问器,验证方法或系统构建方式中所做的任何地方都是实现细节 - 没有单一的最佳方法,并且总会有权衡。