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

参见英文答案 > 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%确定列表来源时才执行可选操作.

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...