Chinaunix首页 | 论坛 | 博客
  • 博客访问: 643855
  • 博文数量: 155
  • 博客积分: 5688
  • 博客等级: 大校
  • 技术积分: 2134
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-15 15:12
文章分类

全部博文(155)

文章存档

2011年(58)

2010年(97)

分类: Java

2011-03-06 19:05:05

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见Mail:mtloveft@hotmail.com
提示本文是关于介绍EMF,即Eclipse modeling Framework
 
 
介绍完了Java Collection Framework,再来看看EMF对JCF的扩展。
首先还是看看Class继承图,如下:
 
 

EList是对List接口稍微进行了扩展,追加了move方法。

AbstractEList是直接继承与AbstractList

并且overrideadd(),addAll(),set(),remove()方法,

并且实现了EListmove(int, E)方法,只是算出Eindex,然后调用move(int, int),

move(int, int)仍然没有实现。

add(E object)方法进行了override,首先判断当Listunique,

并且包含了object,那么就直接返回false。否则调用addUnique()这个hook方法

这个方法在BasicEList里有实现。

 

  1. @Override
  2. public boolean add(E object) {
  3.     if (isUnique() && contains(object)) {
  4.         return false;
  5.     } else {
  6.         addUnique(object);
  7.         return true;
  8.     }
  9. }
 

我们再来看看再BasicEList里对addUnique()的实现。

其中先对List持有的数组进行扩容,然后方法assign()进行赋值。

最后调用hook方法didAdd()didChange()方法。

  1. @Override
  2. public void addUnique(E object) {
  3.     // ++modCount

  4.     grow(size + 1);

  5.     assign(size, validate(size, object));
  6.     didAdd(size++, object);
  7.     didChange();
  8. }
 

再来看看NotifyingListImpladdUnique()方法的实现。因为NotifyingListImpl是继承于BasicEList,

所以是对方法addUnique()override

  1. public void addUnique(E object) {
  2.     //子类可以override这个isNotificationRequired(),检查是否需要进行事件通知

  3.     if (isNotificationRequired()) {
  4.         int index = size;
  5.         boolean oldIsSet = isSet();
  6.         doAddUnique(object);//内容只是简单调用超类的addUnique()

  7.         NotificationImpl notification = createNotification(Notification.ADD, null, object, index, oldIsSet);
  8.         if (hasInverse()) {
  9.             NotificationChain notifications = inverseAdd(object, null);
  10.             if (hasShadow()) {
  11.                 notifications = shadowAdd(object, notifications);
  12.             }

  13.             if (notifications == null) {
  14.                 dispatchNotification(notification);
  15.             } else {
  16.                 notifications.add(notification);
  17.                 notifications.dispatch();
  18.             }
  19.         } else {
  20.             dispatchNotification(notification);
  21.         }
  22.     } else {
  23.         doAddUnique(object);
  24.         if (hasInverse()) {
  25.             NotificationChain notifications = inverseAdd(object, null);
  26.             if (notifications != null)
  27.                 notifications.dispatch();
  28.         }
  29.     }
  30. }

这个方法都会调用doAddUnique(),这个方法只是调用BasicEListaddUnique()方法。

 

  1. protected void doAddUnique(E object) {
  2.     super.addUnique(object);
  3. }

 

 

还有就是在BasicEList内部定义了个UnmodifiableEList这个内部类。

这个类直接继承于BasicEList。但是overrider了关于增加,删除元素的方法。

这些方法都将抛出UnsupportedOperationException异常。

这个List只可以查询,不可以修改。

BasicEList内部还定义了个FastCompare这个内部类。

这个类也直接继承于BasicEList。这个类其实就是在元素比较时,

直接用==,而不需要用equals()方法比较。

NotifyingInternalEListImpl类是对接口InternalEList的实现。

NotifyingInternalEListImpl并没有全部实现InternalEList,

而是把一些实现放到NotifyingListImpl, BasicEListAbstractEList里去实现了。

 

最后总结性的说明一下AbstractEList,BasicEList,NotifyingListImpl这3个类之间的hook方法,

和实现方法。表入下:

 

Class AbstractEList BasicEList NotifyingListImpl
NO 方法 可能
override方法
hook方法 方法 可能
override方法
hook方法 方法 可能
override方法
hook方法
0       BasicEList(int)
BasicEList(Collection)
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) isUnique() addAllUnique(Collection) addAllUnique(Collection) canContainNull() didAdd(int, E)
didChange()
addAllUnique(Collection) 同上  
4 addAll(int, Collection) isUnique() addAllUnique(int, Collection) addAllUnique(int, Collection) canContainNull() didAdd(int, E)
didChange()
addAllUnique(int, Collection) 同上  
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)
newData(int)  
addUnique(E)   didAdd(int, E)
didChange()
addUnique(int, E) canContainNull() didAdd(int, E)
didChange()
addAllUnique(Collection) canContainNull() didAdd(int, E)
didChange()
addAllUnique(int, Collection) 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) 同上  
addAllUnique(int, Collection) 同上  
setUnique(int, E) isNotificationRequired()
hasInverse()
inverseRemove()
inverseAdd()
hasShadow()
shadowSet()
 
E remove(int) isNotificationRequired()
hasInverse()
inverseRemove()
hasShadow()
shadowRemove()
 
     
move(int, int)    
     
     
     
阅读(2737) | 评论(0) | 转发(0) |
0

上一篇:EMF--深入研究到骨子里--16

下一篇:没有了

给主人留下些什么吧!~~