如果你正在寻找基本的单向关联,那么这是最简单的。
单向一对一
class Person { String name; }
单向一对多
class Person { List vehicles; }
如果我假设您询问复合关系(其中一个SSN最多只能分配给一个人),那么您仍然可以实现它。
但是,您决定实施的具体方式取决于您的特定域名,例如如何存储数据,因为
反向导航是必须的
实际上并不是真的,因为您只需检查所有Person实例;或者您可以将所有SSN存储在一个智能数据结构中,该结构允许您快速检查新的SSN是否唯一,然后您将其分配给Person而无需额外检查,因为您已经知道它是唯一的)。
或者您也可以实现相反的查找,即使关联是“单向的”也不被禁止
引用 UML规范 (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 - > *车辆”,所以很明显答案有所不同。但是同样的原则也适用 - 系统有责任维护所有约束,无论在访问器,验证方法或系统构建方式中所做的任何地方都是实现细节 - 没有单一的最佳方法,并且总会有权衡取舍。