【问题标题】:What are the implications of creating an object with a has-a relationship to another object with a has-a relationship to the original object?创建一个具有has-a关系的对象与另一个具有has-a关系的对象的含义是什么?
【发布时间】:2020-03-10 18:35:32
【问题描述】:

问题的措辞有点奇怪。我不知道如何正确表达这个问题,但这里是我所指的一个例子。

假设我有一个名为 Student 的班级。

public class Student {
    private int id;
    private String name;
    private Teacher teacher;
    private GradeLevel gradeLevel;

    public Student(int id, String name, Teacher teacher, GradeLevel gL) {
        this.id = id;
        this.name = name;
        this.teacher = teacher;
        this.gradeLevel = gL;
    }
}

在我的教师课程中,我希望所有学生都有这位教师。

public class Teacher {
    private int id;
    private String name;
    private List<Student> students;

    public Teacher(int id, String name) {
        this.id = id;
        this.name = name;
        this.teacher = teacher;
        updateStudents();
    }

   public void updateStudents() {
       Connection con = null
       PreparedStatement statement = null;
       ResultSet rs = null;

       try {
           con = DriverManager.getConnection(URL, USERNAME, HOST);

           statement = con.prepareStatement("SELECT * FROM students WHERE teacher_id = ?");
           statement.setInt(this.id);

           rs = statement.executeQuery();

           students = new ArrayList<>();

           while(rs.next()) {
               Student student = new Student(rs.getInt(1), rs.getString(2), this, rs.getString(3));
               students.add(student);
           }
       } catch (SQLException e) {
           students = null;
       } finally {
           rs.close();
           statement.close();
           con.close();
       }
   }
}

通过将 Teacher 对象添加到新 Student,我是在创建重复对象还是只是对原始对象的引用?这是最好的方法还是有更好的方法?这种方法有什么问题(如果有的话)?

任何帮助或建议将不胜感激。

【问题讨论】:

  • 谢谢大家的cmets。

标签: java performance object memory-leaks reference


【解决方案1】:

在 Java 中使用“this”时,您传递的是对执行代码的对象的引用。这意味着您不会为每个学生创建新的教师对象,而是将教师的引用传递给学生对象。我也不认为有更好的方法来解决您的“问题”。对我来说看起来像是很好的代码。 :) 希望这可以澄清它。

(一般来说,Java 遵循assign-by-reference 的原则,更多解释见here。)

【讨论】:

    【解决方案2】:

    不,当您传递对对象的引用时,您并没有创建新对象。

    是的,有理由建立相互有关系的关系。然而,在学生和教师的具体情况下,我会将他们与第三个班级联系起来,即班级。这是因为学生可能有不止一位老师,而一位老师可以教多个班级的学生。

    因此,Student 将包含与一名学生严格相关的所有信息。

    Teacher 将包含与教师严格相关的所有信息。

    Class 对象将包含一个或多个 Teacher's。它还将包含一个学生列表。此外,它还可以包含与该类严格相关的信息,例如时间、名称等。

    【讨论】:

    • 谢谢,这很有道理。在我的特殊情况下,每个班级只有一位老师,每个年级只有一位老师,所以这并不重要,但第三个“班级”对象绝对有意义并且会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2021-11-02
    • 2013-02-17
    相关资源
    最近更新 更多