ful*_*ton 9 java api collections list
有两个暧昧的历史原因List.remove吗?
对我来说,这似乎是一个糟糕的设计.
对于List<Integer>它来说,这似乎真的令人困惑.
编辑:
每个人看起来都很好.让我精确一点.
比方说我有一个List<Boolean>.
Integer idx = Integer.valueOf(2);
list.remove(idx)
Run Code Online (Sandbox Code Playgroud)
虽然idx是一个对象,但Java会编译并删除索引2处的项目.
现在,如果它是a List<Integer>,那么相同的代码将调用具有完全不同行为的不同方法.
我们不要谈论泛型会发生什么.
我觉得不同的行为意味着不同的名字是一个宝贵的规则,尤其是在同一个班级内.
Joa*_*uer 12
首先:
List.remove(int)删除指定索引处的元件和List.remove(Object)(或Collection.remove(Object))删除指定的元素.我不确定这是否已经知道,但为了完整起见,我想我会提到它.
需要注意的一个重要部分是API在泛型(更重要的是)自动装箱之前就已经过了很多(Java 1.5中引入了集合API,Java 5中引入了自动装箱).
因此,当他们第一次设计API时,绝对没有办法混淆这两者.即使你List包含的Integer对象,也很简单:如果用原始参数type(int)调用方法,那么它就是索引,如果你传入一个Object(即使它是Integer),那么你传入要移除的对象.
当然,它仍然不是最好的想法(但是相当多的Java API ......不完美),但当时混淆的可能性要低得多.
混乱的几率就越大,因为只有在存在int/ Integer屏障变得不那么明显的感谢自动装箱和自动拆箱.
旁注:集合API的一个重要"特性"是"常用方法的简称".以前的"解决方案" Vector/ Enumeration曾进行很常见的操作出了名的长名字:
Vector.elementAt() 与 List.get()Vector.addElement() 与 Collection.add()Enumeration.hasMoreElements()/ nextElement()vs. Iterator.hasNext()/next()Vector.removeElement() 与 Collection.remove()Vector.removeElementAt() 与 List.remove(int)最后一个是他们可能走得太远的地方.
| 归档时间: |
|
| 查看次数: |
331 次 |
| 最近记录: |