2014-07-13 105 views
0

我有一個項目列表,並填充它後,我想阻止任何可能發生的變化。我嘗試Collections.unmodifiableList,但它阻止添加和刪除,但我仍然可以使用set。所以我鎖定了一個標準的解決方案,如使用Collections.unmodifiableList有沒有辦法阻止列表上的設置操作?

在此條件下有什麼想法?

我的代碼(代碼是用另一種語言,但我想這只是遵循的方法):

public SerFixo(List<? extends Caracteristica> caracteristicas) { 
    this.caracteristicas = Collections.unmodifiableList(new ArrayList<Caracteristica>(caracteristicas.size())); 
    setCaracteristicas(caracteristicas); 
} 

public final void setCaracteristica(Integer indice, Caracteristica caracteristica) { 
    this.caracteristicas.set(indice, caracteristica); 
} 

public final void setCaracteristicas(List<? extends Caracteristica> caracteristicas) { 
    for (int i = 0; i < caracteristicas.size(); i++) { 
     setCaracteristica(i, caracteristicas.get(i)); 
    } 
} 
+0

請發表您的代碼錯誤你讓其他人可以幫助你更好地 –

+1

它僅僅是:列表= Collections.unmodifiableList(名單); – Victor

+2

'Collections.unmodifiableList'不應該允許'set'操作。請張貼您的代碼;它似乎更有可能以某種方式錯誤地使用它。 –

回答

1

Java文檔的Collections.unmodifiableCollection說,你能做的只有讀操作。

http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#unmodifiableCollection(java.util.Collection)

Returns an unmodifiable view of the specified set. This method allows modules to provide users with "read-only"  
access to internal sets. Query operations on the returned set "read through" to the specified set, and attempts to 
modify the returned set, whether direct or via its iterator, result in an UnsupportedOperationException. 

所以,你將不能夠做列表設置操作從unmodifiableList回來,如果你嘗試這樣做,將導致拋出UnsupportedOperationException

+2

另外,請注意,只有來自unmodifiableList的List *返回*是不可修改的。 – laune

+0

終於明白了,在類的另一部分有一些代碼修改了原來的代碼,並且我終於得到了我期待的UnsupportedOperationException。 – Victor

+0

但仍然沒有必要進行反對票。 – Victor

1

我會把列出課程並將其設置爲私人。 然後您可以添加允許訪問的方法。

private List list; 
private boolean listIsBlocked = false;  

public void addItem(Object o){ 
    if(listIsBlocked)return; 
    //adding object to list 
} 

這不是一個標準的解決方案,但也不難實現。

0
list = Collections.unmodifiableList(list); 

Collections.unmodifiableList()爲用戶提供對內部列表的「只讀」訪問權限。將返回列表上的查詢操作「讀取」到指定列表中,並試圖修改返回的列表,無論是直接還是通過其迭代器,都會導致UnsupportedOperationException。你怎麼能說其修改

+0

這只是一個看法。它從原來的其他地方進行了良性修改。我在這裏發現了問題。 – Victor

+0

調試可以防止你得出一個錯誤的結論無所謂歡呼你現在學到的東西2dy你永遠不會忘記生活 – SparkOn

+0

我明白你爲什麼這麼說,但我做了我的功課,它只是一塊巨大的具有概率行爲的軟件,所以直到我確信這個疑問之後問題才明顯。那麼......問題解決了。 – Victor

相關問題