本来有public class Student {
private Set<Grade> grades;
public Set<Grade> getGrades() {
return grades;
}
}
public class Foo {
private List<Grade> grades;
public void add(Student student) {
Grade grade = new Grade(student, this);
grades.add(grade);
student.getGrades().add(grade);这样产生了封装泄漏
于是我把student的getter改成了
public Set<Enrolment> getEnrolments() {
return Collections.unmodifiableSet(enrolments);
}
那么Foo里面的add方法怎么改啊?怎么给学生添加成绩啊?

解决方案 »

  1.   

    public Set<Grade> getGrades() {
        return Collections.unmodifiableSet(grades);
    }
      

  2.   

    //student提供add接口,可以不用暴露grades
    public class Student {
    private Set<Grade> grades;
    //public Set<Grade> getGrades() {
    //return grades;
    //}
        public void add(Grade grade) {grades.add(grade);}
    }
      

  3.   

    明白了, 改成这样了
    public class Student {
        private Set<Grade> grades;
        public Set<Grade> getGrades() {
            return Collections.unmodifiableSet(grades);
        }
        public void addGrade(Grade grade) {
            grades.add(grade);
        }
    }
    public class Foo {
        private List<Grade> grades;
        public void add(Student student) {
            Grade grade = new Grade(student, this);
            grades.add(grade);
            student.addGrade(grade);
        }
    }