Collections.unmodifiableList
2016-03-23 23:02
411 查看
Collections.unmodifiableList的用法场景实际上就是只读,通过传入一个集合,对该集合进行包装,然后在List接口的方法实现里对add,addAll,remove,set方法作了抛异常处理,以至于如果对该包装对象作任何修改操作都会遭到拒绝。源码如下:
类似的还有其他各种类型的集合都有对应的方法。实际使用场景,比如说一个类里面有一个集合,你不希望这个集合被外部类进行修改而只能读取,那么只需要写一个get方法,在该方法内返回的是Collections.unmodifiableList(集合)就行了。这种场景有时在adapter里可以见到,你不希望adapter里的data集合的引用被外部类拿去随便作修改,只希望外部调用自己的add或remove方法,这时就可以这样写:
private static class UnmodifiableList<E> extends UnmodifiableCollection<E> implements List<E> { private static final long serialVersionUID = -283967356065247728L; final List<E> list; UnmodifiableList(List<E> l) { super(l); list = l; } @Override public void add(int location, E object) { throw new UnsupportedOperationException(); } @Override public boolean addAll(int location, Collection<? extends E> collection) { throw new UnsupportedOperationException(); } @Override public boolean equals(Object object) { return list.equals(object); } @Override public E get(int location) { return list.get(location); } @Override public int hashCode() { return list.hashCode(); } @Override public int indexOf(Object object) { return list.indexOf(object); } @Override public int lastIndexOf(Object object) { return list.lastIndexOf(object); } @Override public ListIterator<E> listIterator() { return listIterator(0); } @Override public ListIterator<E> listIterator(final int location) { return new ListIterator<E>() { ListIterator<E> iterator = list.listIterator(location); @Override public void add(E object) { throw new UnsupportedOperationException(); } @Override public boolean hasNext() { return iterator.hasNext(); } @Override public boolean hasPrevious() { return iterator.hasPrevious(); } @Override public E next() { return iterator.next(); } @Override public int nextIndex() { return iterator.nextIndex(); } @Override public E previous() { return iterator.previous(); } @Override public int previousIndex() { return iterator.previousIndex(); } @Override public void remove() { throw new UnsupportedOperationException(); } @Override public void set(E object) { throw new UnsupportedOperationException(); } }; } @Override public E remove(int location) { throw new UnsupportedOperationException(); } @Override public E set(int location, E object) { throw new UnsupportedOperationException(); } @Override public List<E> subList(int start, int end) { return new UnmodifiableList<E>(list.subList(start, end)); } /** * Resolves UnmodifiableList instances to UnmodifiableRandomAccessList * instances if the underlying list is a Random Access list. * <p> * This is necessary since UnmodifiableRandomAccessList instances are * replaced with UnmodifiableList instances during serialization for * compliance with JREs before 1.4. * <p> * * @return an UnmodifiableList instance if the underlying list * implements RandomAccess interface, or this same object if * not. * * @see UnmodifiableRandomAccessList#writeReplace() */ private Object readResolve() { if (list instanceof RandomAccess) { return new UnmodifiableRandomAccessList<E>(list); } return this; } }
类似的还有其他各种类型的集合都有对应的方法。实际使用场景,比如说一个类里面有一个集合,你不希望这个集合被外部类进行修改而只能读取,那么只需要写一个get方法,在该方法内返回的是Collections.unmodifiableList(集合)就行了。这种场景有时在adapter里可以见到,你不希望adapter里的data集合的引用被外部类拿去随便作修改,只希望外部调用自己的add或remove方法,这时就可以这样写:
final class Adapter extends BaseAdapter { List<String> list = Collections.emptyList(); public Adapter(List<String> l) { list.addAll(l); } public void addItem(String s) { list.add(s); } public void removeItem(int position) { list.remove(position); } public List<String> getItems() { return Collections.unmodifiableList(list); } @Override public int getCount() { return 0; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { return null; } }
相关文章推荐
- 用js改变embed标签的src值
- C#设备处理类操作
- 原型设计模型(深拷贝浅拷贝)
- Mysql 常用指令 Mysql初始密码为空 Mysql语句记得加分号
- 关于android从入门到精通4.1.9范例1出现的闪退的问题
- 代码的规范性和对小伙伴的作业审查
- UICollectionView
- js实现匀速运动及透明度动画
- Mybatis框架学习笔记一
- python 基本数据类型的使用
- CODE[VS] 1065 01字符串
- bzoj1726 第二短路
- 排序算法分析归纳总结
- App Store最新审核指南(2015年3月更新版)
- 课本第五章读书笔记
- iOS--UITableView 显示二级菜单
- centos在安装配置redmine
- 八大排序算法之直接插入排序
- 我们是怎么走向平庸的
- 细谈我用c#的类库添加web实例--菜鸟日记