Каковы последствия создания объекта со связью «имеет» с другим объектом со связью «имеет» с исходным объектом? - PullRequest
0 голосов
/ 10 марта 2020

Формулировка вопроса довольно странная. Я не был уверен, как правильно сформулировать вопрос, но вот пример того, что я имею в виду.

Скажем, у меня есть класс с именем 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();
       }
   }
}

Добавляя объект «Учитель» к новому ученику, я создаю дубликат объекта или это просто ссылка на оригинал? Это лучший способ сделать это или есть лучший способ? Что не так с этим подходом?

Буду признателен за любую помощь или совет.

Ответы [ 2 ]

1 голос
/ 10 марта 2020

При использовании «this» в Java вы передаете ссылку на объект, выполняющий код. Это означает, что вы не создаете новый объект учителя для каждого учащегося, а вместо этого передаете ссылку своего учителя на объект своего ученика. Я также не думаю, что есть лучший способ подойти к вашей "проблеме". Похоже, хороший код для меня. :) Надеюсь, что это проясняет это.

(Как правило, Java следует принципу присвоения по ссылке, см. здесь для дальнейшего объяснения.)

0 голосов
/ 10 марта 2020

Нет, вы не создаете новый объект, когда передаете ссылку на объект.

И да, есть причины для взаимных отношений has-a. Однако в конкретном случае c учеников и учителей я бы связал их с третьим классом, классом. Это потому, что у учеников может быть более одного учителя, и учитель может преподавать несколько классов учеников.

Таким образом, ученик будет содержать всю информацию, строго относящуюся к одному ученику.

Учитель будет содержать вся информация, строго относящаяся к учителю.

Объект Class будет содержать одного или нескольких объектов Учителя. Он также будет содержать список студентов. Кроме того, он может содержать информацию, строго относящуюся к этому классу, например, время, имя и т. Д. c.

...