2017-02-21 00:00:00 +0000   |     java data structure container template pattern encapsulation   |   Viewed times   |    

List

继承AbstractList类,实现 size() , get() 方法,就能获得一个“只读”的List。最主要的是一个迭代器Iterator,这在AbstractList里已经包括了。是一个叫Itr的内部类。它的hasNext()是基于size()写的,next()是基于get()方法写的,remove()调用AbstractListremove(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();
    }
}

Set

继承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();
    }
}

Map

继承AbstractMap类,实现 entrySet() 方法。因为size()用的是entrySet()返回的Setsize()方法。而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();
    }
}