Java-Collections中的unmodifiablexxx方法

目录

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进行处理,非常感谢!

上一篇 2022年5月5日
下一篇 2022年5月5日

相关推荐