19

I have just started a project to make my employer a management software. I have a niggling, but potentially simple, query that I can't seem to find any information on.

Is it prudent/good practice to have a 2 way 'has a' relationship between objects. So can, for example, a Client object 'have a' Site, and then the Site 'has a' Client, where the Client object is the Client that 'has' the Site?

public class Client {
    Site site;
}

public class Site {
    Client client;
}

Is there anything objectionable (no pun intended) to this, or is it fine? I am currently creating a mock-up UML for the project, and this has been bothering me.

4

5 回答 5

4

有什么不满意的吗,还是可以的?

对此没有确定的答案。最好的答案是:这取决于您的应用程序的设计。

何时使用

如果您的Client对象应该导航到该Site对象并且您的Site对象应该导航到该Client对象,那么您代码中的当前示例就可以了。不过,您可能需要某种方式来关联这些元素,可能是通过其中一个类或两者中的附加 id 字段来关联这些元素。

如果碰巧您使用的框架可以帮助您像 Hibernate 一样自动绑定类,那么维护循环引用对您来说不是问题。

什么时候不使用

基本上,对于文本序列化,因为它会生成一个无限循环。正如Raibaz 的回答Client中已经提到的,像 Jackson 这样的库在序列化或Site分类为 JSON 字符串1时会陷入无限循环。请注意,这在序列化到其他String数据时也有效,例如通过 XML 中的 JAX-WS Web 服务传递对象(更多信息:Jax-ws Web 服务中的泛型类会发生什么情况?)。

1正如@SimonAndréForsberg 所指出的,这可以使用@Something属于特定库(例如杰克逊库)的注释()来解决,但该解决方案的缺点是您的类将与库紧密耦合。@JsonManagedReference@JsonBackReference

于 2013-08-09T14:38:12.863 回答
2

对象之间存在相互关联是很常见的。

例如,在某些用户界面工具包中,可视组件将引用其子组件,并且每个子组件可能具有对其父组件的引用。

术语has-a经常用于传达一个对象对另一个对象的所有权。当这是真的时,这种关系通常是单向的。

Booch、Rumbaugh 和 Jacobson的“统一建模语言用户指南”中提供了这些术语的一个很好的定义:

聚合——两个类之间的简单关联表示对等点之间的结构关系,这意味着两个类在概念上处于同一级别,没有一个比另一个更重要。有时,您会想要为“整体/部分”关系建模,其中一个类代表一个较大的事物(“整体”),它由较小的事物(“部分”)组成。这种关系称为聚合,表示一种“有”的关系,即整体的一个对象有部分的对象。

于 2013-08-09T14:27:44.720 回答
2

这很常见,但我会考虑您希望子对象与其父对象之间的松散耦合程度。如果您从子对象引用了父对象,那么您将无法与另一个父对象/没有父对象重用该对象。

于 2013-08-09T14:36:33.273 回答
1

我会尽可能坚持单向关系。2-way 关系将两个类联系在一起,其中一个类的更改会导致另一个类更改两个。问问自己这种关系是否真的很自然……

如果必须,只需确保两者都是接口或至少其中一个是接口。

于 2013-08-09T14:37:50.077 回答
1

像您的示例中那样具有双向关联是很正常且很常见的。

您可能要考虑的唯一警告是,当您要序列化对象时,例如在使用 Jackson 或任何其他库的 json 中,您应该从序列化中排除关联的两侧之一,以避免以无限循环结束。

于 2013-08-09T14:30:27.197 回答