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)相关推荐

  1. 巩固一下 JS 可选 (?.)操作符号,原来函数也可以用可选写法,又学到了!

    作者:Ashish Lahoti 译者:前端小智 来源:CSS-Tricket 有梦想,有干货,微信搜索 [大迁世界] 关注这个在凌晨还在刷碗的刷碗智. 本文 GitHub https://githu ...

  2. java list移除所有元素,从List中移除指定 List 中包含的其所有元素(可选操作)。...

    从List中移除指定 List 中包含的其所有元素,这个当然用List里面的removeAll方法了,但是有朋友说能不能不用removeAll呀 于是我就写了如下代码: class="jav ...

  3. java list移除符合条件的元素_从List中移除指定 List 中包含的其所有元素(可选操作)。...

    从List中移除指定 List 中包含的其所有元素,这个当然用List里面的removeAll方法了,但是有朋友说能不能不用removeAll呀 于是我就写了如下代码: List l = ...; L ...

  4. python 操作 postgresql 数据库

    目录 一 简介 历史 描述 特征 函数 索引 触发器 多版本并发控制 规则 数据类型 用户定义对象 二 数据库连接 2.1 安装 psycopg2 2.2 连接数据库 三 创建表 四 插入操作 4.1 ...

  5. 使用python操作postgresql 查询

    1 安装 psycopg2 pip install psycopg2 2.连接数据库 每条完整的sql执行步骤如下: 建立连接获得 connect 对象 获得游标对象,一个游标对象可以对数据库进行执行 ...

  6. LSI SAS 3108 配置操作

    配置LSISAS3108 介绍LSISAS3108的配置操作. 5.1 登录CU界面 介绍登录LSISAS3108的CU配置界面的方法,以及CU界面的主要功能. 5.2 创建RAID 介绍在LSISA ...

  7. c++读二进制文件结束的时候总会异常_python专题文件操作

    一 前言 本篇文章主要对文件操作进行说明,知识追寻者创作必属精品,读完本篇你将获得基础的文件操作能力,深入理解文件操作API,基础真的很重要,不管学什么知识,故看知识追寻者的专题系列真的很不错. 公众 ...

  8. arcgis已试图对空几何执行该操作_ArcGIS中地理配准与空间校正的不同

    ArcGIS中地理配准与空间校正都是用于数据坐标变换的目的,他们之间有什么区别呢? 1.处理对象不同: 地理配准针对栅格数据,而空间校正针对矢量数据. 因此空间校正需要建立在矢量数据编辑的基础上,空间 ...

  9. Hive入门详解操作

    Hive 第一章 Hive简介 1.1. Hive的简介 1.1.1 hive出现的原因 FaceBook网站每天产生海量的结构化日志数据,为了对这些数据进行管理,并且因为机器学习的需求,产生了hiv ...

最新文章

  1. 用Python偷偷告诉你十一假期8亿人都去哪儿浪?
  2. object getkey java_Java S3Object.getKey方法代码示例
  3. 一种关于感受野尺寸计算的思路
  4. 为什么搜索引擎都上HTTPS?SSL证书竟是如此重要—Vecloud微云
  5. nodejs全局变量第一次没赋值要第二次才有是为什么_【NodeJS】async 和 await 的本质...
  6. 输入法图标也会莫名其妙地丢失?
  7. 关于能否命令Scrum团队的对话
  8. Oracle的ha模式启停,数据库oracle 11g 的启停操作
  9. 历史是“混合体”,也是“内幕”:说说《三国大传》
  10. 制作MACOSX10.10.3/10.9安装启动盘U盘的教程
  11. 前端开发知识点解答-CSS-面试
  12. pandas 散布矩阵
  13. 常用linux网络配置命令
  14. Raspberry Pi 的新用法:检测家中的漏水情况
  15. 1208: [HNOI2004]宠物收养所
  16. 3、简单了解Angular应用的启动过程
  17. leetcode动态规划
  18. 织梦cms安装完成后登录后台出现空白。主要原因是php版本的问题
  19. c语言输入奇数n输出一半棱形,c语言输出菱形
  20. 计算机导论怎么不挂科,我们删除的数据,最后都去了哪里?

热门文章

  1. 基于R语言的判别分析
  2. GPS北斗双模技术应用开发研究--几个基本关键词
  3. 命令永久禁用Win10驱动程序强制签名
  4. 翻译:理解特征工程(1)-连续数值数据
  5. 四针角oled屏连接arduino_ESP8266连接OLED显示屏并显示位图图像
  6. 机器人流程自动化+机器学习=智能自动化
  7. [家里蹲大学数学杂志]第264期武汉大学2013年数学分析考研试题参考解答
  8. storm mysql trident_Trident简介
  9. William Xiong's Blog is starting...
  10. SpringBoot升级所出现的问题:When allowCredentials is true, allowedOrigins cannot contain the specia