EMF开发指南之Reference详解

★reference没有默认值,因为它们的默认值都是null
★one-way reference 跟simple attribute比较像,因为涉及到延迟加载,所以getter方法会相对复杂点
★bedirectional reference 双向引用表示reference在对方的opposite里面保存着(如果用annotated interface来定义emf的话,则需要设置两边的opposite属性),对于双向应用的getter方法跟单向一样,区别主要在setter部分,因为在改变关联关系的时候需要同时修改双方的引用,这里会使用到EObject的eInverseAdd()和eInverseRemove()方法,即取消旧的关联关系,建立新的关联关系,且两边同时修改,因此我们应该明白一点,那就是建立了双向关联之后,关联双方只允许被一个reference引用。由于做了很多修改,会触发一系列的Notification,这里使用了一个NotificationChain来收集所有的Notification在最后一一跟通知接收者attach起来
★multiplicity-many reference 一对多引用就是其中有一个引用是一个集合,因此对于多的那一方不存在setter方法
★containment reference在uml图中表述为容器方以by-value的方式聚合0或n个目标对象(被包含对象),在emf中则表现为容器方的containment设置为true,互为containment reference的对象在持久化的时候,将被保存在一个document中。因此在getter方法中也不需要proxy这样的运行机制。对于容器对象来说,被包含对象只能有一份,如果向容器中添加重复对象,最终得到的只有一份。如果将一个目标对象添加到一个容器对象,则必须将其从原有容器中删除。containment reference也可以看成是一种双向引用,因为在EObjectImpl中有一个eContainer属性,用来保存容器对象。我们也可以将containment reference转换成更直接的双向引用,只需要跟双向引用在被引用方添加相应的getter方法,不同之处在于在指定container为true即可。
★non-proxy-resolving reference,默认情况下,reference都会检查互为reference的双方对象是否在一个document之中,然后采用不同的方式,不在同一个document中将采用proxy的方式加载reference对象,如果能确信reference双方对象都在一个document中,那么getter方法就跟single value的attribute没有区别,这里我们只需要将resolveProxies设置为false即可。
★volatile reference跟volatile attribute一样,需要自己手工修改具体实现
★non-changeable reference跟non-changeable reference一样,通常与volatile reference联合使用。
★unsettable reference也没什么好说的
★map reference 在emf中为了支持map,必须先定义map entry,一个 map entry是一个实现了Map.Entry接口并且具有key和value两个feature的EClass类,map entry可以显式或者隐式定义。显式定义,就是在EPackage类中添加一个访问map entry的方法,隐式定义则是在containment reference中使用map entry。如果使用annotated interface定义emf model的话,那么需要这样定义,在package中定义一个返回值为EClass的getXxxx()方法,并添加以下注释:@model但没有instanceClass属性,定义MapEntry的相关属性,比如features属性名列表以及关于feature的属性。隐式定义,这个一般在reference中定义,即返回值必须是Map或者EMap的getter方法,注释必须有@model,且带有mapType或者keyType,valueType属性,如果使用了mapType属性,则必须在Package中显示定义MapEntry的getter方法,使用keyType,valueType定义时,EReference将隐式定义一个包含keyType和valueType属性的MapEntry,且默认的名称为“keyTypeToValueTypeMapEntry”

你可能感兴趣的:(UML)