文章地址:
在文章中描述的一种常见,但是明显是错误的不合适的封装
public class MyBean { private Collection collection; public Collection getCollection() { return collection; } public void setCollection(Collection collection) { this.collection = collection; }}
在我们的项目中,也可以看到有类似的问题。存在一个问题:在使用集合类型的情形下,由于Java中集合类型自身是可变的,这其实并没有任何改变。很明显,无论是通过构造函数传入一个集合实例的引用,还是返回它的引用,这完全没有进行封装。只有当集合实例的引用没有(在外部)保留,也不会返回(到外部),真正的封装才有可能实现。
List list = new ArrayList();MyBean mybean = new MyBean(list);list.add(new Object()); // 我们在mybean外部改变了封装的集合
给出的建议是按照下面这样来进行封装
public class MyBean { private List collection = new ArrayList(); public MyBean(Collection collection) { this.collection.addAll(collection); } public Collection getCollection() { return Collections.unmodifiableList(collection); }}
找了一个实例:
import java.util.ArrayList;import java.util.Collections;import java.util.List;public class Student { private String userName; private Listcourses; public Student(String userName, List courses) { this.userName = userName; this.courses = courses; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public void addCourse(String course) { courses.add(course); } public boolean removeCourse(String course) { return courses.remove(courses); } public List getCourses() { return Collections.unmodifiableList(courses); } public static void main(String[] args) { List list = new ArrayList (); list.add("数学"); list.add("语文"); Student s = new Student("lily", list); List anotherList = s.getCourses(); /** * throws java.lang.UnsupportedOperationException should replace with * s.addCourse(String course) */ anotherList.add("英语"); // 不会走到这一步,因为上边抛出了异常 System.out.println("lily's course.length = " + s.getCourses().size()); }}
参考了: