Abstract Interface(骨架类),Interface是类名,如Collections的Abstract实现有AbstractCollections、AbstractSet、AbstractList、AbstractMap。当然,程序员也可以提供自己的接口实现,而不用依赖于这些骨架类,但是骨架类具有很大的优点:
举例:
下面的一个静态工厂包含了一个完整的功能全面的List实现:
static List<Integer> intArrayAsList(final int[] a){
if(a == null)
throw new NullPointerException();
return new AbstractList<Integer>(){
public Iteger get(int i){
return a[i];
}
@override public Integer set(int i, Iteger val){
int oldVal = a[i];
a[i] = val;
return oldVal;
}
public int size(){
return a.length;
}
}
}
[AbstractList源码:http://www.docjar.com/html/api/java/util/AbstractList.java.html]
从这个类可以看出骨架类的强大优势,此外这个例子是个Adapter,它将int数组看作Integer列表,这个例子提供了一个静态工厂,返回的这个类还是一个不可访问的匿名类,它隐藏在静态工厂的内部。
骨架类的实现通过抽象类的方式提供了帮助,它使得接口的实现类可以扩展骨架类,或者将对于接口的调用转发到一个内部私有的骨架类的实现上,即“模拟多重继承”。在方法上与包装类十分类似。
骨架类将接口的基本方法保留下来将由子类实现,这些基本方法具有鲜明的接口特征,比如Map.Entry的getKey、getValue、setValue,而其他的支持方法则加以实现(override),比如equals、hashCode,此外骨架类还可以增加自己的其他具体支持方法、内部类等,参见AbstractList。
骨架类的目的就是给程序员继承,它区别于简单实现,因为它至少是Abstract的,(可能)不可以子类化。
骨架类的好处在于它是Abstract类,可以增加具体的方法,避免破坏接口。