Memory 如何最有效地更新两个相互依赖的类中的数据

Memory 如何最有效地更新两个相互依赖的类中的数据,memory,optimization,data-structures,redundancy,Memory,Optimization,Data Structures,Redundancy,我已经多次面对这个非常基本的问题,但我从来不知道如何以最有效的方式解决它 我有一个班级“学生”和一个班级“课程”。学生应该通过一份课程列表了解他所访问的所有课程,课程应该通过一份学生列表了解所有正在访问的学生 现在让我们假设我想让一个学生访问一个新课程,所以我创建了一个“addCourse(course course)”方法来将一个新课程添加到学生的课程列表中-没问题。但我也想让课程了解学生正在参观的情况。因此,我为课程类创建了一个“addStudent(Student Student)”方法,

我已经多次面对这个非常基本的问题,但我从来不知道如何以最有效的方式解决它

我有一个班级“学生”和一个班级“课程”。学生应该通过一份课程列表了解他所访问的所有课程,课程应该通过一份学生列表了解所有正在访问的学生

现在让我们假设我想让一个学生访问一个新课程,所以我创建了一个“addCourse(course course)”方法来将一个新课程添加到学生的课程列表中-没问题。但我也想让课程了解学生正在参观的情况。因此,我为课程类创建了一个“addStudent(Student Student)”方法,并在学生的“addCourse”方法中调用它

问题是:我想让这些数据从两个方面都可以更新——学生和课程,但如果我将各自的其他方法添加到自己的方法中,我当然会导致堆栈溢出。那么,我如何才能最有效地防止这种情况


另外,如果我将这些数据存储在这两个类的对象中,我想我的内存中会充斥着比我需要的更多的数据。有没有办法在不丢失数据访问权限的情况下防止这种情况发生?

您有一个
Student
类,该类有一个
AddCourse
方法,该方法更新学生访问的课程列表

您有一个
课程
类,该类有一个
AddStudent
方法,该方法更新正在访问该课程的学生列表

在你的课程中的其他地方,你决定让学生去参观一门课程。例如,如果学生想参加一门课程,可能会有一个用户界面与之交互。该用户的操作应该触发对某些业务逻辑的调用,这些业务逻辑执行将学生添加到课程中所需的所有操作。例如:

function AddStudentToCourse(studentId, courseId)
{
    student = GetStudentById(studentId);
    student.AddCourse(courseId);
    course = GetCourseById(courseId);
    course.AddStudent(studentId);
}
这里的要点是,就学生而言,它只维护一个课程Id号列表。
学生
班实际上没有对课程做任何事情;它只是维护列表,以便其他代码稍后可以引用它

课程相同
;它只是维护一个学生Id号列表

这个设计的美妙之处在于
学生
课程
彼此独立,除了那些ID列表;这些其实只是数字


我不会说这是“最有效”的方法。不过,它确实很管用。

我完全同意您的解决方案的第一部分,也就是说,最好将这两个选项相加。。。方法,并使用一个单独的方法来创建双向关系。但是,我建议使用引用而不是ID。它们不太容易出错,需要更少的空间(在Java中假设为“整数”),并且更容易遍历。我不会担心“淹没”你的记忆,这些双向引用应该真的不成问题。@TilmannZ:随便你喜欢哪个。但是,请注意,
整数
是32位。在32位系统上,引用是32位的,但在64位系统上,引用是64位的。不过,这可能无关紧要,除非你说的是数千亿张唱片。我基本上同意。如果编译为64位,则会得到64位指针。如果编译为32位(限制在4GB左右),即使在64位系统上也会得到32位引用(我认为).Java有点不同,因为Java
压缩
引用,只要选择小于32GB的内存,即使在64位JVM上,它们也只需要32bit。接口是一个简单但很好的主意,如果我再想想,它听起来也很符合逻辑。学生不直接加入课程,而是使用表单或其他方式注册课程就像那样。所以表单设置了连接。