我在java中实现1对1关联时遇到问题。例如,考虑以下类图:
我这样实现:
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对象作为参数。由于这是一对一的关系,我给出的参数也有一个与之相关的学生。所以,这是一个问题。此外,我无法创建没有学生链接的AttendanceRole对象,因为这是1对1的关联。当我第一次尝试创建学生对象并调用其构造函数时,会出现同样的情况。我可以将null作为参数值,但在这种情况下,我不会损害1对1关系约束吗?我该怎么办?
2)另外,我设计这个类,以便我们可以创建一个学生对象并设置其AttendanceRole。我的意思是我们不能创建一个AttendanceRole对象并设置它的学生。这是一个坏主意吗?或者由设计师决定首先创建哪个对象。
谢谢
答案 0 :(得分: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;
}
}
答案 1 :(得分:2)
你到底想要完成什么?
你可以尝试使用枚举,就像上尉天鹰的回答一样。
或者您可以尝试继承:
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 }
}
答案 2 :(得分: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 );
答案 3 :(得分:1)
由于简单的setAttendanceRole(AttendanceRole a)
方法不可能满足约束条件,因此Student
类必须没有这样的方法。
由于无法创建满足约束的AttendanceRole
,因此无法独立创建此类对象。 (是,真的)。由于AttendanceRole
和Student
密切相关,因此它们并不是完全独立的类。
Constaints(不变量)必须仅适用于从可访问方法返回的内容。私有方法和构造函数不需要满足它们。考虑将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()
方法gets hold of the outer-class object使用特殊语法Student.this
。