Java - 2种方式“有一个”关系

2022-09-02 13:57:53

我刚刚开始了一个项目,让我的雇主成为管理软件。我有一个微不足道的,但可能很简单的查询,我似乎找不到任何信息。

在对象之间有一个双向“有”关系是谨慎/好的做法吗?因此,例如,一个对象可以“有一个”,然后“有一个”,其中对象是“有”的?ClientSiteSiteClientClientClientSite

public class Client {
    Site site;
}

public class Site {
    Client client;
}

这有什么令人反感的(没有双关语的意思),还是没问题?我目前正在为该项目创建一个模拟UML,这一直困扰着我。


答案 1

这有什么令人反感的,还是没问题?

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

何时使用它

如果您的对象应导航到该对象,而您的对象应导航到该对象,则代码中的当前示例没有问题。不过,您可能需要某种方法来关联这些元素,可能是通过其中一个类或两个类中的附加id字段来关联。ClientSiteSiteClient

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

何时不使用

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

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


答案 2

这很常见,但我会考虑您希望子对象来自其父对象的松散耦合程度。如果您从子对象中引用了父对象,则无法将该对象与另一个父对象/无父对象一起重用。