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变量域名_Python实现从url中提取域名的几种方法
  2. ajax实现简单的点击左侧菜单,右侧加载不同网页
  3. nullnullC++ LANGUAGE TUTORIAL: CHARACTER ARRAYS...
  4. python linux解密zip_Python Linux系统管理之使用Python管理压缩包
  5. matlab gui 中指定axes窗口画进度条
  6. 关于压缩工具 7z(7-zip) 如何创建自释放档案(选项 -sfx 的解读)
  7. Redis performance --- delete 100 records at maximum
  8. 在 mac 系统下播放.csf 视频的方法
  9. 使用 MQL5 绘制阻力和支撑级别
  10. 电镜的成像原理-透射电镜成像原理1
  11. 计算机找不到海信电视,如何设置海信电视投屏 海信电视投屏设置方法【详解】...
  12. python 自动执行 apdl_【转载】利用VB生成APDL文件 和Python文件的方法
  13. 论文阅读:SO-Net: Self-Organizing Network for Point Cloud Analysis
  14. CatDriver 小米 猫盘 Boot Info
  15. Oracle数据库的空间管理技巧
  16. shell中用grep查找并且不输出_Linux中用 grep查找特定进程,屏蔽grep进程本身(也就是不出现grep --color=auto)...
  17. 远程桌面控制软件,远程桌面控制软件哪个更好用,怎么使用呢
  18. 分享APP软件,发现好玩好用的工具
  19. 【调剂】浙江师范大学机械工程需要调剂部分机械类、自动化类、材料加工类等学术研究生...
  20. oracle触发器 触发事件,oracle 触发器的种类和触发事件

热门文章

  1. 普通青年VS文艺青年VS2B青年,爆笑语录!
  2. python 标签云_python 制作标签云
  3. 【SEMrush教程】SEO关键词魔法工具使用技巧
  4. SQL综合复习试题(一)
  5. 生产周期缩短42%,效率提升28%,申菱展示数据智能成绩单
  6. 任丘虚拟服务器,河北任丘联通dns服务器地址
  7. 心理暗示的威力与心理放松疗法
  8. Kotlin中let、run、with、apply及also的差别
  9. (07)FPGA硬件描述语言
  10. 《富爸爸,穷爸爸》书摘二