集合的成员也需要是不可变的.不可修改仅意味着不能添加或删除任何元素.
即使集合是不可修改的,一旦访问它的代码具有对属于该集合的元素的引用,那么如果该元素不是不可变的,那么它可以被更改.
如果集合的getter返回一个防御性副本,使新的Set引用新的Student对象并返回而不是原始集合,那么这将使集合不可变.
public Set getTutees() {
Set newSet = new HashSet();
for (Student tutee : tutees) {
newSet.add(new Student(tutee.getName(), tutee.getCourse()));
}
return newSet;
}
在此处添加示例以显示使用Collections.unmodifiableSet对此不够:
import java.util.*;
public class ImmutabilityExample {
public static void main(String[] args) {
Student student = new Student("Joe", "Underwater Basketweaving 101");
Tutor tutor = new Tutor("Bill", new Student[] {student});
Set students = tutor.getTutees();
System.out.println("before=" + students);
students.iterator().next().setName("Mary");
System.out.println("" + tutor.getTutees());
}
}
class Student {
private String name;
private String course;
public Student(String name, String course) {
this.name = name;
this.course = course;
}
public String getName() {
return name;
}
public String getCourse() {
return course;
}
public void setName(String name) {
this.name = name;
}
public void setCourse(String course) {
this.course = course;
}
public String toString() {
return "Student, name=" + name + ", course=" + course;
}
}
final class Tutor {
private String name;
private final Set tutees;
public Tutor(String name, Student[] students) {
this.name = name;
tutees = new HashSet();
for (int i = 0; i < students.length; i++) {
tutees.add(students[i]);
}
}
public Set getTutees() {
return Collections.unmodifiableSet(tutees);
}
public String getName() {
return name;
}
}
这个输出是:
before=[Student, name=Joe, course=Underwater Basketweaving 101]
[Student, name=Mary, course=Underwater Basketweaving 101]