2010-12-06 10 views
1

私は理論の違いを理解していますが、コードの実装の違いは何ですか?誰かが例を挙げることはできますか?構成とJavaの双方向結合

+1

お返事ありがとうございました。 http://stackoverflow.com/questions/4298177/association-vs-aggregation(3番目の回答)も助けました。 私は最終的な不確実性を持っています。 このダイアグラムで、関連付けられたクラスのインスタンスが正しいと確信していますか?http://img152.imageshack.us/img152/4981/21083939.pngは、図に示されていないクラスによって所有されていなければなりません(そうでなければ、全体と関連クラスの間に存在しなければなりませんか?) – amax

答えて

0

構成は事実上、一方向の関連性がありますが、意味的には、単に「このことはそのことを参照している」という意味ではなく、「このことはこの物の一部です」という意味です。私たちはいくつかの方法

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

にこのようなものを作成して、私たちは大学でボブ・研究を行います知っている必要があります知っている学生や大学

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; 
    } 
} 

を持って

3

目的。 だから我々は、大学

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

と、university.contains(bob)のようなSMTを行うよりもためにいくつかの新しいメソッドを作成します。

しかし、私たちがユニバーシティへのリンクを持たないのはどうでしょうか。ボブに聞いてみる必要があります。しかしボブは知らない。だから、私たちは構成からバイ・ディレクションに行き、smtのように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

コンストラクタでsetUniversityとaddStudentを強制して、新しい生徒が作成されたときに常に呼び出されるようにする必要がありますか? –

+0

@Kenston Choi、それは使用しているコーディングスタイル/パラダイムによって異なります。とにかく、Javaで不変の双方向構造を構築するのはかなり難しい(プロキシを使って模倣できる)。 –