目录
Collections中API的分类
unmodifiablexxx方法
代码示例
使用场景举例(个人想法)
Collections中API的分类
Collections中提供了unmodifiablexxx方法,可以获取可变类型的不可变形式
unmodifiablexxx方法
- 这种包装器得到的结果是不可变的:只能看(不可改)
- 但是这种“不可变”是在运行阶段获得的,编译阶段无法据此进行静态检查
——如果 错,只在运行阶段(动态错误)
代码示例
以List为例,通过unmodifiableList获取其不可变形式listCopy
这时候的listCopy只可看,但不可改,如果代码中试图对其进行修改,将在运行阶段 错
不可修改(unmodifiable)的包装器通过截获所有将修改集合的操作并抛出UnsupportedOperationException,剥夺了修改集合的能力
但是,实际上listcopy和list都指向了同一个对象,只是listCopy被限制不可修改;我们仍然可以通过修改list来改变listcopy指向的对象的内容【相当于‘别名’】
运行结果如图所示,listCopy指向对象的内容确实被修改了
使用场景举例(个人想法)
我能想到的unmodifiablexxx的使用场景之一是用于类的get方法,作为返回值
在本例中,Student类只含有一个private final属性namelist,存储学生的名字;只含有相对应的一个get方法,可以获取namelist的内容
在getNamelist方法中,返回的是Collections.unmodifiableList(namelist)【namlist的不可变形式】,客户端中用nl接受,故而被限制不可修改nl的内容;如果客户端试图修改,就会如上图 错
这个例子里,getNamelist中使用unmodifiableList的优点在于:实际实现的的效果等同于防御性拷贝,可以防止客户端恶意篡改类中的属性;同时并没有开辟新的内存空间,实现了内存空间上的节约【相较于返回new ArrayList<>(namelist)——常见的防御性拷贝形式】
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!