请问各位大侠,Collections 提供不可修改集合的目的是什么?
List<String> list = java.util.Collections.EMPTY_LIST;
list.add("12");抛异常:Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:131)
at java.util.AbstractList.add(AbstractList.java:91)
at com.mapbar.effective.Effective.main(Effective.java:12)
因为设计都成静态并且不可修改的集合。
 public static final List EMPTY_LIST = new EmptyList();  private static class EmptyList
extends AbstractList<Object>
implements RandomAccess, Serializable {
// use serialVersionUID from JDK 1.2.2 for interoperability
private static final long serialVersionUID = 8842843931221139166L;        public int size() {return 0;}        public boolean contains(Object obj) {return false;}        public Object get(int index) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }        // Preserves singleton property
        private Object readResolve() {
            return EMPTY_LIST;
        }
    }

解决方案 »

  1.   

    我们这边有这么个应用:
    系统启动,会将一些经常用到的,数据又不常改动的表数据,加载到内存里。为了防止别人改变此List或Map,就使其不可修改:Collections.unmodifiableMap(xxxMap);
      

  2.   

    它是个静态对象,如果可以修改,后面的人调用的岂不是你修改过的非空的对象。比如一个查询,查不到东西怎么办?返回null很可能会让调用的代码多处理一层逻辑,自己new一个返回去也可以,但是方法执行多次,你内存中就有很多没用的东西,这就是有用的时候了
      

  3.   

    NULL Object 模式。 返回一个 空的集合,而不是null时。
      

  4.   

    说实话 这个集合的作用我不清楚 不过可以从其他类似的类中找到一些端倪 比如
    ThreadPoolExecutor保存任务的队列有三种 分别是无界队列、有界队列和一个无法添加任何元素进去的队列(java.util.concurrent.SynchronousQueue<E>) 当为此线程池选择队列的时候 如果选择最后这个队列 那么任务不会进入队列而是直接启动一个新线程我想你EMPTY_LIST也是有作用的 虽然俺想不出他是用在哪里的..(3L有道理..)