看板 java 關於我們 聯絡資訊
※ 引述《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