博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
封装集合
阅读量:6208 次
发布时间:2019-06-21

本文共 2084 字,大约阅读时间需要 6 分钟。

hot3.png

文章地址:

在文章中描述的一种常见,但是明显是错误的不合适的封装

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 List
courses; 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()); }}

参考了:

转载于:https://my.oschina.net/ChinaHaoYuFei/blog/1602398

你可能感兴趣的文章
接口测试
查看>>
深入理解Linux守护进程
查看>>
windows服务器下的ftp server搭建
查看>>
如何在C#中使用Win32和其他库之三
查看>>
python redis插件安装
查看>>
linux增加调整虚拟内存
查看>>
将openstack的Token认证信息存储在memcache中
查看>>
surround360
查看>>
我的友情链接
查看>>
MM引擎新应用——爱车加油记
查看>>
[DB]mysql 及sql server2005下实现分页效果的sql语句
查看>>
pyinotify结合ftplib自动上传新建的文件
查看>>
SaltStack WEB UI Halite初体验
查看>>
ESXI忘记密码怎么办?
查看>>
Linux内核学习四库全书
查看>>
thinkphp-where-数组条件-普通查询
查看>>
安装Tengine
查看>>
×××S 2012 交互式报表 -- 同步交互式排序
查看>>
linux 文件按照大小排列
查看>>
Exchange 2010 创建设备室邮箱
查看>>