Java で考えると、次のようになります。
AbstractList から読み取り専用リストを作成するには、get() と size() を実装する必要があります。
それは私を混乱させました、コードは以下の通りです:
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);
}
}
リストは読み取り専用リストですか? なんで?
わかりました、答えはイエスです。私は延長し、 orが呼び出された場合AbstractList
にスローします。unmodifiableList を取得したい場合は、良い選択です。ただし、どちらも完全に不変というわけではないことに注意してください。UnsupportedOperationException
set
and
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);
ありflyweight pattern
ますCountingIntegerList
。毎回get()
呼び出されるため、次のソース コードである Integer からキャッシュを取得します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);
}
ですよね?