思考说:这是一种在Java中创建只读列表的方法吗?在Java中
要创建AbstractList的只读列表中,您必须农具get()和大小()。
它搞糊涂了,代码如下:
public class CountingIntegerList
extends AbstractList<Integer> {
private int size;
public CountingIntegerList(int size) {
this.size = size < 0 ? 0 : size;
}
public Integer get(int index) {
return Integer.valueOf(index);
}
public int size() { return size; }
public static void main(String[] args) {
List list = new CountingIntegerList(30);
}
}
是列出一个只读的目录?为什么?
好吧,答案是肯定的,因为我扩展了AbstractList
,如果set
或and
被调用,它会丢失UnsupportedOperationException
。如果我想得到一个不可修改的列表,Collections.unmodifiableList()
是一个不错的选择。但要记住,他们两人都没有深入一成不变:
List<StringBuilder> list = new ArrayList<StringBuilder>();
StringBuilder sb = new StringBuilder();
sb.append("hello");
list.add(sb);
System.out.println(list);
list = Collections.unmodifiableList(list);
sb.append("world");
System.out.println(list);
有在CountingIntegerList
一个flyweight pattern
。因为每次get()
被调用,它从整型的valueOf()
源代码获得缓存:
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
return new Integer(i);
}
是否是正确的?
这是可能的方法之一。 为什么?正如你所看到的,你不能添加任何元素到这个List ..(不是通过add方法。)我会建议有parameterised构造函数来接受初始List。否则你的不可修改列表将永远不会有任何数据 – 2013-04-24 13:33:47
哪一部分让你感到困惑? – mikej 2013-04-24 13:34:30
'你的不可修改列表将永远不会有任何数据'? – znlyj 2013-04-24 13:39:50