有没有办法阻止列表上的设置操作?

时间:2014-07-13 18:11:32

标签: java

我有一个项目列表,填充后我想阻止可能发生的任何变化。我正在尝试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));
    }
}

3 个答案:

答案 0 :(得分:1)

Collections.unmodifiableCollection的Java文档说你只能进行读操作。

请参阅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返回的List执行set操作,如果您尝试执行此操作,则会导致UnsupportedOperationException

答案 1 :(得分:1)

我会将List放在一个类中并将其设置为private。 然后,您可以添加允许访问的方法。

private List list;
private boolean listIsBlocked = false;    

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

这不是一个标准的解决方案,但也不难实现。

答案 2 :(得分:0)

 list = Collections.unmodifiableList(list); 

Collections.unmodifiableList()为用户提供对内部列表的“只读”访问权限。对返回列表的查询操作“读取”到指定列表,并尝试修改返回的列表,无论是直接还是通过其迭代器,都会产生UnsupportedOperationException。你怎么能说它可以修改