UML: how to implement Association class in Java

hqt picture hqt · Nov 18, 2012 · Viewed 30.1k times · Source

I have this UML Association class. Note that: horizontal line is a solid line and the vertical line is a dashed line.

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

I understand this relationship but I have met some problems when implement this UML to code. I can implement relation between class Student and class Course to code. Here is my code:

class Student {
  Vector<Course> b;
}

class Course {
   Vector<Student> a;
}

But, at class Transcript, I don't understand so much, how to use this class in code. Is it the property of both class Student and Course. So, if that's true then the code will be:

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

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

Is it true? If this is wrong, please teach me how to implement this UML.

Thanks :)

Answer

JB Nizet picture JB Nizet · Nov 18, 2012

First of all, don't use Vector, as it's an old class that shouldn't be used anymore for more than 10 years. Use either a Set or a List.

If the Transcript class contains information about the way a student attends a course (for example, the date of its subscription to the course), you could implement it like this:

class Student {
    Set<Transcript> transcripts;
}

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

class Course {
    Set<Transcript> transcripts;
}

That doesn't prevent you from providing a method in Student that returns all his courses: 

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

If Transcript doesn't contain any information, then it's probably there to model how these classes would be mapped in database tables, where the only way to have a many-to-many association between two tables is to use a join table holding the IDs of the two associated tables.