如何初始化为"交织在一起" Java中的对象同时存在?

时间:2016-10-26 09:53:20

标签: java

我目前正在开展一个旨在将Java应用程序链接到数据库的Java学校项目。 我们必须使用由3个类组成的学校模型化的典型示例: -老师 -学生 -subject

每个类都有一些参数,但我遇到的问题是教师中有一个Subject类的对象(称为专业),而Subject中有一个Teacher类的对象(被称为inCharge),知道主题是专业是在教师。

我必须初始化一个教师的ArrayList,并且我尝试按如下方式进行:

while (rset.next()){
    Prof **toInsert** = new Teacher(rset.getInt("NUM_PROF"),
                             rset.getString("NOM_PROF"),
                             rset.getString("PRENOM_PROF"),
                             rset.getString("ADR_PROF"),
                             rset.getString("CP_PROF"),
                             rset.getString("VILLE_PROF"),
                             **new Subject**(rset.getString("CODE"),
                                        rset.getString("LIBELLE"),
                                        rset.getInt("H_COURS-PREV"),
                                        rset.getInt("H_COURS_REA"),
                                        rset.getInt("H_TP_PREV"),
                                        rset.getInt("H_TP_REA"),
                                        rset.getString("DISCIPLINE"),
                                        rset.getInt("COEFF_CC"),
                                        rset.getInt("COEFF_TEST"),
                                        **toInsert**);
    ListeProf.add(i, toInsert);
    ++i;
}

我的Teacher类构造函数如下所示:

public Teacher(..., Subject speciality){
    ...
    m_speciality = speciality;
}

My Subject类构造函数如下所示:

public Subject(..., Teacher inCharge){
    ...
    m_inCharge = inCharge;
}

正如你所看到的,我的问题是我想要创建的主题的构造函数是toInsert教师的专长,需要使用这个老师。 有没有办法同时进行对象的初始化,或者我应该单独创建两个对象,然后使用setter将它们相互绑定?

对于代码中的法语部分,我试图只翻译需要帮助的部分,并提前感谢您的答案^^

1 个答案:

答案 0 :(得分:0)

应避免实例之间的周期性依赖关系 - 尤其是因为您无法实际创建实例,正如您所发现的那样。

如果确实需要将教师作为主题的属性,那么您可以采用的方法是在Subject类上设置一个setter:

  while (rset.next()) {
    Subject subject = new Subject(... /* don't specify Teacher as parameter */);

    Teacher teacher = new Teacher(..., subject);

    subject.setTeacher(teacher);
  }

但你应该重新审视你的设计,看看你是否可以摆脱它们。

这里跳出来的是你正在Teacher Subject的属性。这对我来说似乎不对:一方面,很多老师可能会教授同一个科目。 (当然,每位教师都可以教多门科目。)

您尝试在此处建模的关系如下:

  • Teacher教授Subject
  • SubjectTeacher
  • 讲授

我将构建"由#34;关系作为TeacherSubject类之外的内容,例如:

// If only one teacher teaches a subject.
Map<Subject, Teacher> isTaughtBy;

那么你可以这样做:

  Map<Subject, Teacher> isTaughtBy;
  while (rset.next()) {
    Subject subject = new Subject(... /* don't specify Teacher as parameter */);

    Teacher teacher = new Teacher(..., subject);

    isTaughtBy.put(subject, teacher);
  }