UML: как реализовать класс Association в Java - программирование

UML: как реализовать класс Association в Java

У меня есть этот класс ассоциации UML. Обратите внимание: горизонтальная линия является сплошной линией, а вертикальная линия - пунктирной линией.

 ---------                  ---------
|         |*(a)        *(b)|         |
| CLASS   |________________|  CLASS  |
|STUDENT  |     |          |  COURSE |
 ---------      |           ---------
                |*(c)
          ______|______
         |             |
         |             |
         |  CLASS      |
         | TRANSCRIPT  |
         |_____________|

Я понимаю эту взаимосвязь, но я столкнулся с некоторыми проблемами при реализации этого UML для кода. Я могу реализовать отношение между классами Student и class Course к коду. Вот мой код:

class Student {
  Vector<Course> b;
}

class Course {
   Vector<Student> a;
}

Но, в классе Transcript, я не так много понимаю, как использовать этот класс в коде. Является ли это свойством как класса Student, так и Course. Итак, если это правда, то код будет:

class Student {
  Vector<Course> b;
  Vector<Transcript> c;
}

class Course {
  Vector<Student> a;
  Vector<Transcript> c;
}

Это правда? Если это не так, пожалуйста, научите меня, как реализовать этот UML.

Спасибо:)

4b9b3361

Ответ 1

Прежде всего, не используйте Vector, так как это старый класс, который больше не должен использоваться больше 10 лет. Используйте либо Set, либо List.

Если класс Transcript содержит информацию о том, как студент посещает курс (например, дату его подписки на курс), вы можете реализовать его следующим образом:

class Student {
    Set<Transcript> transcripts;
}

class Transcript {
    Student student;
    Course course;
    Date subscriptionDate;
}

class Course {
    Set<Transcript> transcripts;
}

Это не мешает вам предоставить метод в Студенте, который возвращает все его курсы:  

public Set<Course> getCourses() {
    Set<Course> result = new HashSet<Course>();
    for (Transcript transcript : transcripts) {
        result.add(transcript.getCourse());
    }
    return result;
}

Если Transcript не содержит никакой информации, то, вероятно, существует возможность моделировать, как эти классы будут отображаться в таблицах базы данных, где единственный способ иметь связь "много-ко-многим" между двумя таблицами - использовать join table, содержащую идентификаторы двух связанных таблиц.

Ответ 2

Чтобы добавить, на вашей модели вы обозначаете множественность по классу ассоциации. Это необязательно, потому что класс ассоциации IS сама ассоциация, и соотношение множественности исходных двух классов будет удовлетворять.

Ответ 3

Я знаю, что этот вопрос очень старый, но у меня есть более удобный способ, чем вложение отношений n..1 в класс ассоциации:

public class Transcript {
    //Transcript properties
} 

public class Course {

    private Map<Student, Transcript> transcriptsByStudent;
}

public class Student {

    private Map<Course, Transcript> transcriptsByCourse;
}