Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java对象中的循环引用是否不好?_Java - Fatal编程技术网

Java对象中的循环引用是否不好?

Java对象中的循环引用是否不好?,java,Java,我最近在写一些代码。要点如下: class Student { private String name; private List<Performance> performances; } class Performance { private Student student; private List<Integer> perfData; } 班级学生{ 私有字符串名称; 私人名单表演; } 课堂表现{ 私立学生; 私有列表数据; } 学生

我最近在写一些代码。要点如下:

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

class Performance {
   private Student student;
   private List<Integer> perfData;
}
班级学生{
私有字符串名称;
私人名单表演;
}
课堂表现{
私立学生;
私有列表数据;
}

学生与绩效之间存在循环依赖关系。这不好吗?我们如何防止/打破这种情况而不丧失查找学生所有表现的能力,并将表现映射回学生。

在做这些事情时,你应该始终问自己的问题是:在现实世界中,我的设计有意义吗?在有人开始纠正我之前,有些情况下设计没有映射到逻辑,有些情况下它确实映射到逻辑

当我看到你的代码时,我首先想到的是大学软件中的东西是如何存储的。你需要有关于学生的信息、每个学生的成绩评估以及许多其他互联平台(电子邮件、注册课程等)。这意味着,对于一个给定的学生来说,有些表演有一些数据。因此,它们属于学生,因此,通过将学生与表演联系起来,你在那里所做的一切都是好的。我认为错误的是,你可能在某个你不应该使用的地方使用这种表现,并试图将其映射回学生。没有更大的图景就没有解释的余地

现在,如果我们想象一个更大的图景,你可以做什么来解耦系统,将一个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);
}
班级学生{
私有字符串名称;
私有字符串地址;
私人城市;
私人国籍;
私有数据dob;
私立长期学生;
} 
课堂表现{
私立长期学生;
私有列表数据;
}
班级绩效经理{
私人名单表演;
公共列表getPerformanceForId(长id);
}
类邮件项{
私有字符串到;
私有字符串消息;
私立长期学生;
}
类邮件管理器{
私人名单邮件;
私有列表getMailForId(长id);
}

当然,上面的例子只是一个简单的例子,但其思想是相互无关的系统(性能和邮件)是通过id链接的,而不是通过引用链接的。

就个人而言,
学生
不应该关心他们的性能,因为这是由
性能
类维护的。也许某种形式的
时间表
绩效管理器
更适合保存绩效列表,它可以提供查询,以列出指定的
学生
被分配到的绩效。也许,
Performance
的实例应该有一个
列表
学生
?不,循环依赖本身并不坏,这只是一个建模透视图-例如,如果您想建模人与人之间的关系,其中一个人对象引用了其他人对象(自引用),那么循环/自反依赖是不可避免的,这是软件设计的问题。如果你想这样做,这是完全可以的。我在软件中看到过上百次这样的事情,我自己也做过。