加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – Arrays.asList违反Liskov替换原则吗?

发布时间:2020-12-15 04:35:50 所属栏目:Java 来源:网络整理
导读:参见英文答案 Do Collections.unmodifiableXXX methods violate LSP? [closed]????????????????????????????????????4个 Arrays.asList(..)返回数组的List包装器.此包装器具有固定大小,并由数组直接支持,因此对add()或其他尝试修改列表的函数的调用将抛出Uns
参见英文答案 > Do Collections.unmodifiableXXX methods violate LSP? [closed]????????????????????????????????????4个
Arrays.asList(..)返回数组的List包装器.此包装器具有固定大小,并由数组直接支持,因此对add()或其他尝试修改列表的函数的调用将抛出UnsupportedOperationException.

开发人员经常对此感到惊讶,这从stackoverflow中的问题可以看出.

然而,根据Liskov替换原则(LSP),List接口有一个add()方法,对于List的所有派生应该不出所料.

Arrays.asList()返回的类型是违反Liskov替换原则的一个例子吗?

解决方法

严格来说,它是,因为LSP没有可选接口成员的概念:方法是接口的一部分,或者它不是接口的一部分.

但是,Java类库在将某些接口方法指定为可选时明确允许违反LSP. List< T> .add()就是这样一种方法.其他变异方法(addAll,remove等)也标记为可选.

从本质上讲,Java库的设计者采用了一种捷径:不是为可变列表创建一个单独的接口(扩展只读列表),而是指定一个操作“可选”.此外,它们没有为您提供一种方法来测试列表实例是否为只读,因此您唯一的选择是捕获运行时异常,这是一个非常糟糕的主意.这相当于您必须跟踪列表的来源,并且只有在您100%确定列表来源时才执行可选操作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读