0

我有一个关于在 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 对象,因为这是一对一的关联。当我第一次尝试创建一个学生对象并调用它的构造函数时,也会发生同样的情况。我可以将 null 作为参数值,但在这种情况下,我不会损害 1 对 1 关系约束吗?我能做些什么呢?

2)另外,我设计了这个类,以便我们可以创建一个学生对象并设置它的 AttendanceRole。我的意思是我们不能创建一个 AttendanceRole 对象并设置它的学生。这是一个坏主意吗?还是由设计者决定首先创建哪个对象。

谢谢

4

4 回答 4

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;
    }
}
于 2013-04-24T12:44:09.943 回答
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 }


}
于 2013-04-24T12:49:58.420 回答
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 );
于 2013-04-24T12:46:14.337 回答
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.this

于 2013-04-24T13:03:32.860 回答