可选操作(UnsupportedOperationException)
Java——可选操作(UnsupportedOperationException)
最近在看《Java编程思想》第17章的时候,发现了一个新的名词——可选操作。
执行各种不同的添加和移除的方法在Collection接口中都是可选操作。这意味着实现类并不需要为这些方法提供功能定义。
读这部分的时候感觉很懵逼,不懂什么是可选操作。讲道理一个在接口中定义的方法,实现类在实现接口的时候都应该去提供对应方法的具体实现。这是在学习接口的时候建立的一种逻辑关系。但是此处好像说如果是可选操作的话就可以不用提供具体的实现。接着往下读
为什么你会将方法定义为可选的呢?那是因为这样做可以防止在设计中出现接口爆炸的情况。容器类库中的其他设计看起来总是为了描述每个主题的各种变体,而最终患上了令人困惑的接口过剩症。……未获支持的操作是一种特例,可以延迟到需要时再实现。但是,为了让这种方式能够工作:
1.UnsupportedOperationException必须是一种罕见事件。
2.如果一个操作是未获支持的,那么在实现接口的时候可能就会导致UnsupportedOperationException异常,而不是将产品程序交给客户以后才出现此异常,这种情况是有道理的。
这一段话好像是说增加这种特性是为了避免接口爆炸的情况,而且还特地举了容器的例子。确实不论是ArrayList还是Set中定义的方法是真的多。而且为了应用这种情况甚至设计了一种异常UnsupportedOperationException(名字可真够长的)。下面看一下书中给出的实际例子:
static void test(String msg,List<String> list){System.out.println("--- " + msg + " ---");Collection<String> c = list;Collection<String> subList = list.subList(1,8);Collection<String> c2 = new ArrayList<String>(subList);try{ c.retainAll(c2); } catch(Exception e) {System.out.println("retainAll(): " + e);}......//后面的省略了
}
public static void main(String[] args) {List<String> list = Arrays.asList("A B C D E F G H I J K L".split(" "));test("Modifiable Copy", new ArrayList<String>(list));test("Arrays.asList()", list);
}
/*Output:
--- Modifiable Copy ---
--- Arrays.asList() ---
retainAll(): java.lang.UnsupportedOperationException
*///:~
从这份代码里面我们去研究一下,不同的只是传入的参数,一个直接把Arrays.asList()方法的结果当作参数传入;另外一个则是重新new 了一遍ArrayList()的对象并将其当作参数传入。
去看一下源码:
从源码中我们可以清楚的看见,Arrays.asList()方法是在Arrays类中重新new了一个ArrayList类的对象,并且其中并没有包含所有的方法。而第一种传参明显就是new了一个完全崭新的ArrayList类的对象。这也就是会出现UnsupportedOperationException异常的原因。
此处仅作为学习的笔记记录,如有不对的地方欢迎评论指正!
可选操作(UnsupportedOperationException)相关推荐
- 巩固一下 JS 可选 (?.)操作符号,原来函数也可以用可选写法,又学到了!
作者:Ashish Lahoti 译者:前端小智 来源:CSS-Tricket 有梦想,有干货,微信搜索 [大迁世界] 关注这个在凌晨还在刷碗的刷碗智. 本文 GitHub https://githu ...
- java list移除所有元素,从List中移除指定 List 中包含的其所有元素(可选操作)。...
从List中移除指定 List 中包含的其所有元素,这个当然用List里面的removeAll方法了,但是有朋友说能不能不用removeAll呀 于是我就写了如下代码: class="jav ...
- java list移除符合条件的元素_从List中移除指定 List 中包含的其所有元素(可选操作)。...
从List中移除指定 List 中包含的其所有元素,这个当然用List里面的removeAll方法了,但是有朋友说能不能不用removeAll呀 于是我就写了如下代码: List l = ...; L ...
- python 操作 postgresql 数据库
目录 一 简介 历史 描述 特征 函数 索引 触发器 多版本并发控制 规则 数据类型 用户定义对象 二 数据库连接 2.1 安装 psycopg2 2.2 连接数据库 三 创建表 四 插入操作 4.1 ...
- 使用python操作postgresql 查询
1 安装 psycopg2 pip install psycopg2 2.连接数据库 每条完整的sql执行步骤如下: 建立连接获得 connect 对象 获得游标对象,一个游标对象可以对数据库进行执行 ...
- LSI SAS 3108 配置操作
配置LSISAS3108 介绍LSISAS3108的配置操作. 5.1 登录CU界面 介绍登录LSISAS3108的CU配置界面的方法,以及CU界面的主要功能. 5.2 创建RAID 介绍在LSISA ...
- c++读二进制文件结束的时候总会异常_python专题文件操作
一 前言 本篇文章主要对文件操作进行说明,知识追寻者创作必属精品,读完本篇你将获得基础的文件操作能力,深入理解文件操作API,基础真的很重要,不管学什么知识,故看知识追寻者的专题系列真的很不错. 公众 ...
- arcgis已试图对空几何执行该操作_ArcGIS中地理配准与空间校正的不同
ArcGIS中地理配准与空间校正都是用于数据坐标变换的目的,他们之间有什么区别呢? 1.处理对象不同: 地理配准针对栅格数据,而空间校正针对矢量数据. 因此空间校正需要建立在矢量数据编辑的基础上,空间 ...
- Hive入门详解操作
Hive 第一章 Hive简介 1.1. Hive的简介 1.1.1 hive出现的原因 FaceBook网站每天产生海量的结构化日志数据,为了对这些数据进行管理,并且因为机器学习的需求,产生了hiv ...
最新文章
- 用Python偷偷告诉你十一假期8亿人都去哪儿浪?
- object getkey java_Java S3Object.getKey方法代码示例
- 一种关于感受野尺寸计算的思路
- 为什么搜索引擎都上HTTPS?SSL证书竟是如此重要—Vecloud微云
- nodejs全局变量第一次没赋值要第二次才有是为什么_【NodeJS】async 和 await 的本质...
- 输入法图标也会莫名其妙地丢失?
- 关于能否命令Scrum团队的对话
- Oracle的ha模式启停,数据库oracle 11g 的启停操作
- 历史是“混合体”,也是“内幕”:说说《三国大传》
- 制作MACOSX10.10.3/10.9安装启动盘U盘的教程
- 前端开发知识点解答-CSS-面试
- pandas 散布矩阵
- 常用linux网络配置命令
- Raspberry Pi 的新用法:检测家中的漏水情况
- 1208: [HNOI2004]宠物收养所
- 3、简单了解Angular应用的启动过程
- leetcode动态规划
- 织梦cms安装完成后登录后台出现空白。主要原因是php版本的问题
- c语言输入奇数n输出一半棱形,c语言输出菱形
- 计算机导论怎么不挂科,我们删除的数据,最后都去了哪里?
热门文章
- 基于R语言的判别分析
- GPS北斗双模技术应用开发研究--几个基本关键词
- 命令永久禁用Win10驱动程序强制签名
- 翻译:理解特征工程(1)-连续数值数据
- 四针角oled屏连接arduino_ESP8266连接OLED显示屏并显示位图图像
- 机器人流程自动化+机器学习=智能自动化
- [家里蹲大学数学杂志]第264期武汉大学2013年数学分析考研试题参考解答
- storm mysql trident_Trident简介
- William Xiong's Blog is starting...
- SpringBoot升级所出现的问题:When allowCredentials is true, allowedOrigins cannot contain the specia