Композиция против двунаправленной ассоциации в Java - PullRequest
1 голос
/ 06 декабря 2010

Я понимаю различия в теории, но в чем разница в реализации кода?Кто-нибудь может привести несколько примеров?

Ответы [ 2 ]

3 голосов
/ 06 декабря 2010

Цель: у нас есть студенты и университеты

class University {
    private final Set<Student> students = new HashSet<Student>();
    void addStudent(Student s){students.add(s);}
}

class Student {
    private final String name;
    public Student(String name) {
        this.name = name;
    }
}

Мы каким-то образом создаем этот материал

University university = new University();
Student bob = new Student("Bob");
university.addStudent(bob);

И знаем, что нам нужно знать, учится ли Боб в университете.Таким образом, мы создаем некоторый новый метод для университета

boolean contains(Student student){
        for(Student s : students){
            if(s.equals(student)) return true;
        }
        return false;
    }

, и, в отличие от university.contains(bob).

, но что будет, если у нас не будет связи с университетом?Нам нужно спросить это, Боб.Но Боб не знает.Таким образом, мы переходим от композиции к двунаправленному тексту и создаем smt как

class University {
    private final Set<Student> students = new HashSet<Student>();
    void addStudent(Student s){
        students.add(s);
        s.setUniversity(this);
    }
    boolean contains(Student student){
        for(Student s : students){
            if(s.equals(student)) return true;
        }
        return false;
    }
}

class Student {
    private final String name;
    private University university;
    public Student(String name) {
        this.name = name;
    }
    void setUniversity(University u){
        university = u;
    }
    boolean doYouStudyInUniversity(){
        return university != null;
    }
}
//ask
bob.doYouStudyInUniversity();
0 голосов
/ 06 декабря 2010

Композиция, по сути, является однонаправленной ассоциацией - за исключением того, что семантически мы интерпретируем ее как означающую, что «эта вещь является частью этой вещи», а не просто «эта вещь содержит ссылку на эту вещь».

...