Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中实现1对1类_Java_Uml_One To One - Fatal编程技术网

在java中实现1对1类

在java中实现1对1类,java,uml,one-to-one,Java,Uml,One To One,我在java中实现1对1关联时遇到了一个问题。例如,请考虑以下类图: 我是这样实现的: public class Student{ private AttendanceRole attendance; public Student(AttendanceRole attendance){ this.attendance=attendance; addTwoWayLink(this); //creates the two-way link betwe

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

}
问题是:

我假设我创建了一个学生对象,并希望更改学生的出勤角色。在本例中,我调用setAttendanceOLE方法。但我必须给它一个对象作为参数。因为这是一个1对1的关系,所以我给出的参数也有一个与之关联的student。所以,这是一个问题。此外,由于这是一个1对1的关联,我无法创建没有学生链接的AttendanceOLE对象。当我第一次尝试创建一个student对象并调用其构造函数时,也会出现同样的情况。我可以将null作为参数值,但在这种情况下,我不破坏1对1关系约束吗?我能怎么办

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


谢谢你

试着重新安排你的课程:

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

我建议你设计如下的东西

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;
    }
}
创建学生对象时,传递相应的全职/兼职考勤角色

创建学生对象的代码示例:


你到底想完成什么

你可以用类似天鹰上尉的答案的枚举来试试

或者您可以尝试使用继承:

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 }


}

由于简单的setAttendanceOleAttendanceOLE方法不可能满足约束,因此您的学生类不能有这样的方法

由于不可能创建满足约束的OLE,因此不能独立创建此类对象。是的,真的。作为一名学生和一名学生是如此紧密地联系在一起,他们实际上并不是完全分开的班级

常量不变量只能在可访问方法返回时应用。私有方法和构造函数不需要满足它们。考虑将AuthDunCurror作为嵌套类的学生,并使用工厂函数代替学生的公共构造函数。


AttendanceRole.getStudent方法使用特殊语法Student。这。

AttendanceRole真的需要对Student的引用吗?谢谢,但是setter方法中不会出现同样的问题吗?你能告诉我如何在那个设计中实现setter方法吗?实际上我想实现图中给出的类图。在您的代码中,全职和兼职学生都是student的子类,但图片中的情况并非如此。我想实现图片中的确切情况,看看Apurv给出的情况。如果AttentDancerole真的需要学生参考,这不是答案。
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 }


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