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 オブジェクトをパラメーターとして渡す必要があります。これは 1 対 1 の関係であるため、i が与えるパラメーターには学生も関連付けられています。だから、これは問題です。また、これは 1 対 1 の関連付けであるため、学生へのリンクがないと、AttendanceRole オブジェクトを作成できません。最初に学生オブジェクトを作成してそのコンストラクターを呼び出そうとすると、同じ状況が発生します。パラメータ値として null を指定することもできますが、この場合、1 対 1 の関係の制約を損なうことはありませんか? 私はそれについて何ができますか?

2) また、学生オブジェクトを作成し、AttendanceRole を設定できるように、このクラスを設計します。つまり、AttendanceRole オブジェクトを作成してその生徒を設定することはできません。これは悪い考えですか?または、どのオブジェクトを最初に作成するかはデザイナー次第です。

ありがとうございました

4

4 に答える 4

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 に答える