【问题标题】:Should two-way relations be avoided?应该避免双向关系吗?
【发布时间】:2012-04-01 12:21:03
【问题描述】:

在我的 java 应用程序中,我有一些实体,其中一些可能引用了另一个。

假设我有一个实体:

class Work{
 User manager;
}

class User{
  List works;
}

然后,如果我创建一个 Work 实例,它将保存一个用户的引用,该用户将持有该 Work 的引用。

我怕会有没完没了的嵌套关系。

所以我想知道这是否应该避免?

【问题讨论】:

  • 我不确定您所说的“无休止的嵌套关系”是什么意思,尽管在概念上和实践上,每个实体都指向另一个实体的双向关系是完全可以接受的。
  • 双向关系不应该是首选,但有时很难避免。例如,如果您的类都实现了 toString(),则很危险。

标签: java reference design-patterns


【解决方案1】:

这种双向关系没有问题。您似乎担心遍历 User 到 Work 并再次返回等导致的某种循环。

问问自己是否需要得到Works 给定User 和User 给定Work。如果是这种情况,那么存储双向引用是有意义的。

【讨论】:

  • 同意,但这些可能是方法,不一定是成员变量。
【解决方案2】:

这种双向引用没有问题。 我能想到的唯一可能进入“无限嵌套”的情况是,如果两个类中的代码都进入了方法的相互调用,例如

class Work {
  User manager;

  public void doWorkStuff() {
    manager.doUserStuff() {
  }  
}

class User {
  Work works;

  public void doUserStuff() {
    works.doWorkStuff();
  }
}

【讨论】:

    【解决方案3】:

    这种情况取决于设计。 Work 和 User 共享什么样的关系?是 1:m、m:1 还是 m:n?根据这个结果,我们应该相应地设计类。

    根据您的问题,我可以看到 1 个用户可以有多个作品(工作列表),但 1 个作品只能有 1 个用户。因此,Work 类中的用户将是确定作品所有者的实体。因此,相应地命名它,即 clas Work { private User owner;....}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 2014-10-24
      • 2012-10-14
      • 2010-11-21
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多