【问题标题】:Are circular references in Java objects bad? [duplicate]Java 对象中的循环引用不好吗? [复制]
【发布时间】:2014-07-27 09:15:03
【问题描述】:

我最近正在编写一些代码。这是要点 -

class Student {
   private String name;
   private List<Performance> performances;
}

class Performance {
   private Student student;
   private List<Integer> perfData;
}

学生和表现具有循环依赖关系。这很糟糕吗?我们如何防止/打破这种情况,而又不会失去查找学生所有表演并将其提供给学生的表演映射的能力。

【问题讨论】:

  • 就个人而言,Student 不应该关心他们有什么表现,因为这是由Performance 类维护的。可能某种SchedulePerformancesManager 对保存表演列表更有用,这可以提供查找以列出给定Student 分配给的表演......作为一个想法。也许,Performance 的实例应该有 ListStudents
  • 不,循环依赖本身并不坏,这只是一个建模视角——例如,如果你想对人之间的关系进行建模,其中一个人对象引用了其他人对象(self-参考),那么循环/自反依赖是不可避免的。
  • 这是你软件设计的问题。如果你想这样做,那完全没问题。我在软件中看到过一百次类似的事情,并且自己做了。

标签: java


【解决方案1】:

在做这些事情时,您应该经常问自己的问题是:我的设计在现实世界的场景中是否有意义?在有人跳进来纠正我之前,有些情况下设计没有映射到逻辑,有些情况下确实如此。

当我查看您的代码时,首先想到的是大学软件中的内容是如何存储的。您需要了解学生信息、每个学生的绩效评估以及许多其他相互关联的平台(电子邮件、注册课程等)。这意味着,对于给定的学生,有一些表演有一些数据。所以它们属于学生,所以你在那里所做的很好,将学生与表演联系起来。我认为错误的事实是,您可能在不应该的地方使用该性能,并试图将其映射回学生。没有更大的图景给解释留下了空间。

现在,如果我们要想象更大的图景,您可以做些什么来解耦系统,那就是为学生分配一个 id。

class Student {
   private String name;
   private String address;
   private String city;
   private String nationality;
   private Data dob;
   private long studentId;
} 

class Performance {
   private long studentId;
   private List<Integer> perfData;
}

class PerformanceManager{
    private List<Performance> performances;

    public List<Performance> getPerformanceForId(long id);
}

class MailItem{
    private String to;
    private String message;
    private long studentId;
}

class MailManager{
    private List<MailItem> mails;
    private List<MailItem> getMailForId(long id);
}

当然,上面的例子只是一个简化,但想法是彼此无关的系统(Performance 和 Mail)是通过 id 而不是通过引用链接的。

【讨论】:

    猜你喜欢
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 2012-06-08
    相关资源
    最近更新 更多