在 java 代码中实现 UML 三元关联

Impliment UML Ternary Association in java Code

我目前在代码中实现三元关联时遇到一些问题。 我得到二进制的, 但我不确定三元协会。

这是典型的大学场景。

讲师可以向一名或多名学生教授一门学科
学生只能从一位讲师那里教授一门学科
讲师只能教一个学生一门学科

这三个 class 之间存在三元关联。

这三个 class 之间的关系显示在下面的 UML class 图中,还有多重性

我在互联网上阅读了有关此问题的不同来源,但找不到解决方案

如何实现这三个 class 之间的关联?要么, 一般来说,classes(在java)之间实现关联的可能方法是什么?

通常,您会将协会本身建模为一个独立的实体(不能称其为 class Class,因为 java.lang.Class 已采用该名称;通常人们命名这样的 class Klass,因为很明显它指的是什么;如果你愿意,你也可以使用你的 Teaching。那么你就只有 KlassTeacherKlassSubjectKlassStudent 之间的二进制关联。在这个观点中,TeacherStudent 根本没有关联,除非通过它们间接参与 Klass(与其他对类似)。

根据阿马丹 我正在准备一个答案

由于我是 java 的新手,语法可能不正确 如果此解决方案有误,请指正

//Lecturer class
class Lecturer{
    private List<Klass> klassList; 

    public List<Klass> getKlasses(Klass klassList){
        retrun klassList;
    }

    public List<Klass> addKlasses(Klass klassList){
        this.klassList = klassList;
    }

    teachStudents(){
        klassList = getKlasses()

        for (int i = 0; i < klassList.size(); i++) {
            (klassList.get(i)).teachSubjectToStudent();
        }
    }
}

//Student class
class Student{
    private Klass klass;
    private List<Subject> learnedSubjectList; 

    public void learn(Subject subject){
        learnedSubjectList.add(subject);
    }
}

//Subject class
class Subject{
    private Klass klass;
}

//Klass class
class Klass{
    private Lecturer lecturer;
    private Student student;
    private Subject subject;

    Klass(Lecturer lecturer,Student student,Subject subject){
        private this.lecturer = lecturer;
        private this.student  = student;
        private this.subject  = subject;
    }

    //implimentation of how subject was teach to a student
    public void teachSubjectToStudent(){
        this.student.learn(subject)
    }
}

//this class is use for code execution
public class TestA {
    public static void main(String[] args) {
        Lecturer lecturer = new Lecturer();
        Subject subject   = new Subject();

        Student student1   = new Student();
        Student student2   = new Student();
        Student student3   = new Student();

        Klass klass1 = new Klass(lecturer,student1,subject);
        Klass klass2 = new Klass(lecturer,student2,subject);
        Klass klass3 = new Klass(lecturer,student3,subject);

        List<Klass> list = new ArrayList<Klass>();
        list.add(klass1);
        list.add(klass2);
        list.add(klass3);

        //create association link between lecturer class and klass class list
        lecturer.addKlasses(list);
    }
}

一如既往,这取决于。

实现关联的常用方法 类 是使用关联数组。在您的示例中,您将(最终)组合使用 Lecturer/Subject 来访问 Student 的列表。如果您的要求不同,您可以在提供 Teacher 时,例如 return Subject/Student 的列表。

使用数据库时,您将在 table Teaching 中拥有 Lecturer/Subject/Student 的主键。这允许像上面提到的那样进行单独选择。

一些伪代码:

class Teaching {
  private Hash lectRef; // assoc. array 

  public void addTeaching(Lecturer lect, Student stud, Subject subj) {
    if lectRef[lect.hash] == None { lectRef[lect.hash] = []; }  
    // if none, default an empty array here
    // lect.hash is a unique hash code for the Lecturer object

    lectRef[lect.hash].append((stud, subj); 
    // tuple of student/subject referenced

    // if you need other fast results (e.g. subjects per student or the like) you need to hash them here too
  }

  public [(Stud, Subj)] studSubj (Lecturer lect) {
    return lectRef[lect.hash];  
    // returns the array of student/subject tuples
  }

  // add other result operations like subjects per student as needed
}