分类: Java
2011-03-06 19:05:05
EList是对List接口稍微进行了扩展,追加了move方法。
而AbstractEList是直接继承与AbstractList。
并且override了add(),addAll(),set(),remove()方法,
并且实现了EList的move(int, E)方法,只是算出E的index,然后调用move(int, int),
而move(int, int)仍然没有实现。
对add(E object)方法进行了override,首先判断当List是unique,
并且包含了object,那么就直接返回false。否则调用addUnique()这个hook方法
这个方法在BasicEList里有实现。
我们再来看看再BasicEList里对addUnique()的实现。
其中先对List持有的数组进行扩容,然后方法assign()进行赋值。
最后调用hook方法didAdd()和didChange()方法。
再来看看NotifyingListImpl对addUnique()方法的实现。因为NotifyingListImpl是继承于BasicEList,
所以是对方法addUnique()的override。
这个方法都会调用doAddUnique(),这个方法只是调用BasicEList的addUnique()方法。
还有就是在BasicEList内部定义了个UnmodifiableEList这个内部类。
这个类直接继承于BasicEList。但是overrider了关于增加,删除元素的方法。
这些方法都将抛出UnsupportedOperationException异常。
这个List只可以查询,不可以修改。
BasicEList内部还定义了个FastCompare这个内部类。
这个类也直接继承于BasicEList。这个类其实就是在元素比较时,
直接用==,而不需要用equals()方法比较。
NotifyingInternalEListImpl类是对接口InternalEList的实现。
而NotifyingInternalEListImpl并没有全部实现InternalEList,
而是把一些实现放到NotifyingListImpl, BasicEList和AbstractEList里去实现了。
最后总结性的说明一下AbstractEList,BasicEList,NotifyingListImpl这3个类之间的hook方法,
和实现方法。表入下:
Class
AbstractEList
BasicEList
NotifyingListImpl
NO
方法
子类可能
override方法hook方法
方法
子类可能
override方法hook方法
方法
子类可能
override方法hook方法
0
BasicEList(int)
BasicEList(Collection extends E>)newData(int)
1
add(E)
isUnique()
addUnique(E)
addUnique(E)
didAdd(int, E)
didChange()addUnique(E)
isNotificationRequired()
hasInverse()
inverseAdd()
hasShadow()
shadowAdd()
2
add(int, E)
isUnique()
addUnique(int, E)
addUnique(int, E)
canContainNull()
didAdd(int, E)
didChange()addUnique(int, E)
同上
3
addAll(Collection extends E>)
isUnique()
addAllUnique(Collection extends E>)
addAllUnique(Collection extends E>)
canContainNull()
didAdd(int, E)
didChange()addAllUnique(Collection extends E>)
同上
4
addAll(int, Collection extends E>)
isUnique()
addAllUnique(int, Collection extends E>)
addAllUnique(int, Collection extends E>)
canContainNull()
didAdd(int, E)
didChange()addAllUnique(int, Collection extends E>)
同上
5
set(int, E)
isUnique()
setUnique(int, E)
setUnique(int, E)
canContainNull()
didSet(int, E, E)
didChange()setUnique(int, E)
isNotificationRequired()
hasInverse()
inverseRemove()
inverseAdd()
hasShadow()
shadowSet()
6
remove(Object)
remove(int)
E remove(int)
didRemove(int, E)
didChange()E remove(int)
isNotificationRequired()
hasInverse()
inverseRemove()
hasShadow()
shadowRemove()
7
removeAll(Collection>)
primitiveGet(int)
remove(int)
8
move(int, E)
move(int, int)
move(int, int)
didMove(int, E, int)
didChange()move(int, int)
9
retainAll(Collection>)
primitiveGet(int)
remove(int)
BasicEList | ||
方法 | 子类可能 override方法 |
hook方法 |
BasicEList(int) BasicEList(Collection extends E>) |
newData(int) | |
addUnique(E) | didAdd(int, E) didChange() | |
addUnique(int, E) | canContainNull() | didAdd(int, E) didChange() |
addAllUnique(Collection extends E>) | canContainNull() | didAdd(int, E) didChange() |
addAllUnique(int, Collection extends E>) | canContainNull() | didAdd(int, E) didChange() |
setUnique(int, E) | canContainNull() | didSet(int, E, E) didChange() |
E remove(int) | didRemove(int, E) didChange() | |
move(int, int) | didMove(int, E, int) didChange() | |
NotifyingListImpl | ||
方法 | 子类可能 override方法 |
hook方法 |
addUnique(E) | isNotificationRequired() hasInverse() inverseAdd() hasShadow() shadowAdd() |
|
addUnique(int, E) | 同上 | |
addAllUnique(Collection extends E>) | 同上 | |
addAllUnique(int, Collection extends E>) | 同上 | |
setUnique(int, E) | isNotificationRequired() hasInverse() inverseRemove() inverseAdd() hasShadow() shadowSet() |
|
E remove(int) | isNotificationRequired() hasInverse() inverseRemove() hasShadow() shadowRemove() |
|
move(int, int) | ||