继承AbstractList
类,实现 size()
, get()
方法,就能获得一个“只读”的List。最主要的是一个迭代器Iterator
,这在AbstractList
里已经包括了。是一个叫Itr
的内部类。它的hasNext()
是基于size()
写的,next()
是基于get()
方法写的,remove()
调用AbstractList
的remove(int)
方法。所以AbstractList
的primitive方法是size()
, get()
。
public class SimplestList<E> extends AbstractList<E> {
List<E> list = new ArrayList<>();
@Override
public E get(int index) {
return list.get(index);
}
@Override
public int size() {
return list.size();
}
}
继承AbstractSet
类,实现 size()
, iterator()
方法。因为Set
接口不接受随机访问,所以没有get()
方法。但是AbstractSet
又没有给一个Iterator
的默认实现,所以还要写一下iterator()
方法。
下面代码没有重新写一个Iterator
,而是简单代理了一下成员域中的set。一般情况下,还是需要写一个Iterator
的,
public class SimplestSet<E> extends AbstractSet<E> {
Set<E> set = new HashSet<>();
@Override
public int size() {
return set.size();
}
public Iterator<E> iterator() { // 这里偷懒没有写Iterator,只是代理了一下
return set.iterator();
}
}
继承AbstractMap
类,实现 entrySet()
方法。因为size()
用的是entrySet()
返回的Set
的size()
方法。而put()
方法是optional
的。
不想重写Map.Entry
类的话,可以使用AbstractMap.SimpleEntry
。
public class SimplestMap<K,V> extends AbstractMap<K,V> {
Map<K,V> map = new HashMap<>();
@Override
public Set<Map.Entry<K,V>> entrySet() { // 自己写entrySet的话,可以利用AbstractMap.SimpleEntry
return map.entrySet();
}
}