0

0

什么是集合框架中的Decorator模式_Collections.unmodifiable系列原理

P粉602998670

P粉602998670

发布时间:2026-02-13 11:25:02

|

777人浏览过

|

来源于php中文网

原创

collections.unmodifiablexxx 是装饰器模式的典型实现,因其通过轻量级代理类持原始集合引用,拦截修改操作并抛异常,读操作委托底层,统一接口且不继承具体类型,符合装饰器核心特征。

什么是集合框架中的decorator模式_collections.unmodifiable系列原理

为什么 Collections.unmodifiableXXX 是装饰器模式的典型实现

它不是“包装一个新对象”,而是用一个轻量级代理类,持有一个对原始集合的引用,并在所有修改方法(如 addremoveclear)中直接抛出 UnsupportedOperationException。原始集合本身完全不变,行为被“拦截+重定义”,这正是装饰器模式的核心:不改变被装饰对象,只动态叠加职责(这里是“不可变性”)。

  • 它没有继承原始集合类型(比如不继承 ArrayList),而是实现同一接口(如 List),满足“统一接口、透明使用”原则
  • 所有读操作(getsizeiterator)全部委托给底层集合,开销几乎为零
  • 写操作不是被忽略,而是明确拒绝——这是“增强语义”,不是简单转发,属于装饰器中 ConcreteDecorator 的典型行为

unmodifiableListunmodifiableSet 的行为差异在哪

表面上看都是“不可修改”,但它们的装饰逻辑粒度不同:前者只拦截 List 接口定义的修改方法(add(int,E)set(int,E) 等),后者则针对 Set 接口的方法(addremove)。关键在于,它们各自持有的是 ListSet 类型引用,而非 Collection——这意味着如果你把一个 Set 传给 unmodifiableList,编译都过不去。

魔法映像企业网站管理系统
魔法映像企业网站管理系统

技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作

下载
  • 类型安全由泛型和接口契约保障,不是靠运行时检查
  • 不存在“通用不可修改装饰器”,每个 unmodifiableXXX 都是针对具体接口定制的具体装饰器(UnmodifiableListUnmodifiableSet 等)
  • 它们都继承自同一个抽象装饰器基类 UnmodifiableCollection,复用公共逻辑(如 iterator() 的只读封装)

常见误用:以为返回不可修改视图就等于数据安全

这是最常踩的坑:Collections.unmodifiableList(list) 只保证你拿到的那个 List 引用不可改,但只要原始 list 引用还活着,它依然能被修改,而你的“不可修改视图”会立刻反映出这些变更——因为二者指向同一底层数组或结构。

  • 它不深拷贝,也不冻结状态,只是加了一层只读门禁
  • 若需真正隔离,必须配合不可变数据结构(如 ImmutableList from Guava)或手动复制(new ArrayList(original) 再套 unmodifiable)
  • 如果原始集合本身是线程不安全的,那即使套了 unmodifiable,多线程并发读+原始引用写,仍可能引发 ConcurrentModificationException

和手写装饰器比,unmodifiable 系列省掉了什么

它省掉了所有“装饰器链管理”逻辑:没有抽象装饰器类让你去继承,也没有组合多个装饰器的自由度(比如你没法同时套“不可修改 + 日志记录 + 缓存”)。JDK 的实现是封闭的、单职责的、高度优化的——每个 UnmodifiableXxx 类都直接实现对应接口,内部只持一个字段 final Collection c(或 final List list),连构造函数都极度精简。

  • 没有泛型擦除带来的桥接方法开销;所有方法都是直接转发或抛异常,JIT 很容易内联
  • 不支持运行时动态增删装饰行为,它是“一次性装饰”,符合工具方法定位
  • 你不能扩展它(类是 final),也不该继承它——它的存在意义就是“用完即弃”,不是框架扩展点
装饰器模式在这里不是为了炫技,而是用最少的对象创建、最浅的调用栈、最明确的语义,解决一个非常具体的契约问题:**让一个可变对象,在某个上下文中,表现出不可变的接口行为**。理解这一点,才能避开“以为安全了”的幻觉。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
guava包作用
guava包作用

guava是一个java库,增强了java标准库,提供更有效率和易于使用的集合、实用程序、缓存和并发工具。想了解更多guava的相关内容,可以阅读本专题下面的文章。

265

2024.05.29

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

709

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

561

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

213

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

206

2025.08.29

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

541

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

26

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

38

2026.01.06

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

12

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号