2013-04-24 78 views
0

我在java中實現1對1關聯有一個問題。例如,求索以下類圖:在java中實現1到1類

enter image description here

我實現這樣的:

public class Student{ 
    private AttendanceRole attendance; 

    public Student(AttendanceRole attendance){ 
     this.attendance=attendance; 
     addTwoWayLink(this); //creates the two-way link between objects 
    } 

    public void setAttendanceRole(AttendanceRole a){ //if a students changes from 
     attendance = a;        //part time to full time 
    } 

} 

public class AttendanceRole{ 
    private Student student; 

    void addTwoWayLink(Student student){ 
     this.student=student; 
    } 

} 

這裏的問題是:

1)假設我創建了一個學生對象和我想要改變學生的出勤角色。在這種情況下,我調用setAttendanceRole方法。但是我必須給它一個AttendanceRole對象作爲參數。由於這是1對1的關係,我給出的參數也有一個與之相關的學生。所以,這是一個問題。此外,我不能創建一個沒有鏈接到學生的AttendanceRole對象,因爲這是1對1關聯。當我第一次嘗試創建一個學生對象並調用它的構造函數時,會出現同樣的情況。我可以給null作爲參數值,但在這種情況下,我不會傷害1對1關係約束嗎?我能做些什麼呢?

2)另外,我設計了這個類,以便我們可以創建一個學生對象並設置其AttendanceRole。我的意思是我們不能創建AttendanceRole對象並設置其學生。這是一個壞主意嗎?或者,設計師會首先創建哪個對象。

謝謝

+1

'AttendanceRole'是否真的需要引用'Student'? – Detheroc 2013-04-24 12:45:37

回答

3

嘗試重新安排你的類:

public enum ROLE_TYPE { FULL_TIME, PART_TIME } 

public class student { 

    private ROLE_TYPE attendanceRole; 

    public SetRoleType(ROLE_TYPE type) 
    { 
     this.attendanceRole = type; 
    } 

    public GetRoleType() 
    { 
     return attendanceRole; 
    } 
} 
+0

如果'AttendanceRole'真的需要引用'Student',這不是一個答案。 – Raedwald 2013-04-24 13:04:41

1

我建議你設計的東西像下面

public interface AttendanceRole { 
} 

public class FullTimeStudent implements AttendanceRole { 
} 

public class PartTimeStudent implements AttendanceRole { 
} 

public class Student { 
    private AttendanceRole attendaceRole; 
    public AttendanceRole getAttendanceRole(){ 
     return attendaceRole; 
    } 
    public void setAttendaceRole(AttendaceRole attendaceRole)} 
     this.attendaceRole = attendaceRole; 
    } 
} 

當你創建Student對象,通過相應的考勤作用(全職/兼職)。

代碼示例創建Student對象:

Student student1 = new Student(); 
Student student2 = new Student(); 
FullTimeStudent fullTimeStudent = new FullTimeStudent(); 
PartTimeStudent partTimeStudent = new PartTimeStudent(); 
student1.setAttendanceRole(fullTimeStudent); 
student2.setAttendanceRole(partTimeStudent); 
+0

謝謝,但在setter方法中不會出現同樣的問題?你能告訴我如何在該設計中實現setter方法嗎? – yrazlik 2013-04-24 12:50:05

2

你到底要完成什麼?

你可以用一個枚舉來試試這個,就像Capt。Skyhawk的答案一樣。

或者你可以用繼承的嘗試:

public abstract class Student{ 

    public void methodA() { ... } 


    public void methodB(); 

} 

public class FullTimeStudent extends Student { 

    public void methodB(){ //fulltime implementation } 

} 

public class PartTimeStudent extends Student { 


    public void methodB(){ //parttime implementation } 


} 
+0

實際上我想實現圖中給出的類圖。在你的代碼中,全職和兼職學生是學生的子類,但在圖片中並非如此。我想實現圖片中的確切情況 – yrazlik 2013-04-24 12:51:42

+0

請看看Apurv給出的[答案](http://stackoverflow.com/a/16192399/2239110)。 – Jim 2013-04-24 12:56:02

1

由於這是不可能的簡單setAttendanceRole(AttendanceRole a)的方法來滿足約束,你Student類不能有這樣的方法。

由於無法創建滿足約束條件的AttendanceRole,所以不可能獨立創建這樣的對象。 (是的,真的)。由於AttendanceRoleStudent是如此密切相關,它們並不是完全獨立的類。

約束(不變量)必須僅適用於從可訪問方法返回。私人方法和構造函數不需要滿足它們。考慮使AttendanceRole爲嵌套類Student,並使用工廠函數而不是公共構造函數Student

public class Student { 
     public abstract class AttendanceRole { 
     ... 

     public final Student getStudent() { 
      return Student.this; 
     } 
     } 

     private final class FullTimeStudent extends AttendanceRole { 
     ... 
     } 

     private AttendanceRole role; 

     private Student() { 
     ... 
     // this.role is null 
     } 

     public static Student createFullTimeStudent() { 
     final Student s = new Student(); 
     s.role = new FullTimeStudent(); 
     return s; 
     } 

     public final AttendanceRole getRole() { 
     return role; 
     } 

AttendanceRole.getStudent()方法使用特殊的語法Student.thisgets hold of the outer-class object