作者tkcn (小安)
看板java
标题Re: [问题] UnsupportedOperationException?
时间Mon Jan 25 15:04:00 2010
※ 引述《adrianshum (Alien)》之铭言:
: 与是不是 array 没关系.
: 为什麽内部用 array 放就不可以 add remove?
举这个例子是因为 array 不能动态改变 size,
所以如果需要 add, remove,
就必须像 java.util.ArrayList 那样偷偷动些手脚。
而 Arrays$ArrayList 在操作後,
其内容仍然会与原先传入的 array 相同。 (因为根本是同一个 array)
也就是说我可以利用 Arrays.asList() 得到 List 物件後对它进行操作,
之後直接存取 array 时就已经是被操作过後的物件,
而不需要再用 array = list.toArray()。
在不破坏上面这个特性的前提下,
如果 Collection 的内部是用 array,
那就一定不能 add, remove。
这是我当初的那样说的想法,不过好像不是很重要 :p
: 单纯只是那个是一个 unmodifiable list 而已吧.
: 既然是一个 non-modifiable list, 当然不让你
: 去增删里面的 elements.
: 是不是合理的 OO 设计, 这就见仁见智了. 反正
: 它的 contract 也说明了容许 implementation
: 不支援某些功能的话, 也不可以说有多错...
: 或者有人会觉得把 add/remove 放到一个叫 ModifiableList
: 的 interface, 但我想当初设计上不这样做, 是
: 多 了这一层的 interface, 用起来就会很麻烦.
: 反正 90% 情况下用 collection 都是不需要特
: 定当做 unmodifiable 来使用, class hierarchy
: 搞得太复杂, 用起来会很混乱, 究竟什麽时候
: parameter 要宣告用 modifiable list 什麽时候
: 要用 (unmodifiable) list 呢? 诸如此类...
感谢前辈的指点。
这里节录一下 AbstractList 的 API 说明:
To implement an unmodifiable list, the programmer needs only to extend this
class and provide implementations for the get(int) and size() methods.
To implement a modifiable list, the programmer must additionally override
the set(int, E) method (which otherwise throws an UnsupportedOperationExce-
ption).
If the list is variable-size the programmer must additionally override the
add(int, E) and remove(int) methods.
其实 Arrays.ArrayList 有提供 set method,
所以他应该是一个 non-variable-size 的 modifiable list。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.122.183.199