`

EMF开发指南之Attribute详解

阅读更多
★simple attribute没什么好说的,是最基本的类型,与单值(single value)的java基本类型(int,boolean,String等)相对应
★data type attribute,所有由emf model生成的类型都是由EObject派生的,不过还有一些类不是从EObject派生的,这时候就需要自定义一个Ecore Date Type 和我们要使用的类型对应,在这里定义的data type只是起符号的作用,在使用的时候跟simple data没什么区别,在运行的时候将作为一个实际java类型的代理存在,在emf model中,所有的类型都是EDataType的一个实例,与基本类型不同在于,int,boolean,String是emf model预定义的(java.util.Date也是基本类型,而java.sql.Date不是),对于自定义的data type来说,还存在一个问题,就是序列化(或反序列化)的时候,需要将自定义的类型串行化成string(或反之),默认会调用toString方法,但是emf framework提供了更好的方式,即在package的Factory类中增加了两个方法convertXxxxToString(EDataType eDataType, Object instanceValue) 和createXxxxFromString(EDataType eDataType, String initialValue) ,我们可以替换里面的默认做法使用自己的实现,因此每次增加一个自定义的DataType类型的时候,我们也要在factory中重新实现这两个方法。
★在annotated java中无须定义Data Type接口,emf generator会根据相关attribute在Package和Factory类中添加与EDataType相关的内容。
★enumeration attribute,attribute表示类型、状态的时候一般采用枚举类型属性。因为生成的enumeration 类都有一个private的构造函数,因此可以使用==来比较两个enumeration的异同。同时enumeration还包含一系列int类型的常量来表示每种枚举类型的实际值。
★multi-value attribute 就是对应的get方法返回值是EList(Array)的attribute,如果希望List中的每一个值均唯一,那么需要设置unique为true,一般情况下,我们不使用String[]作为multi-value attribute,这个主要跟notification有关,一般数组只是针对char和byte的情况。
★java.util.List和EList之间的区别是后者多了一个remove()方法
★default value 只有single valued attribute(data type attribute也算一种single valued attribute)才有默认值,默认情况下,boolean是false,数字类型是0,对象类型是null,如果是非string类型的attribute,ecore model将采用factory中的convertStringToXxxx方法将制定的字符串默认值转换成指定的值
★volatile attribute 默认情况下将使用一个field来保存attribute的值,但是volatile类型的属性有些特别,在get的时候它不会采用保存在field中的值而是运行时计算。通常volatile类型的attribute也是non changeable的,因为volitale类型的attribute通常都是通过计算得到,提供setter方法没有 意义,所以在设置volatile为true的时候不要忘了把changeable也设置为false
★non-changeable attribute 默认情况下attribute都是changeable,non-changeable的attribute将不提供setter方法,而对于multi-value attribute属性来说,属性值的内容改变可以通过相应的容器接口来做到,因此setter方法对于multi-value attribute是不会生成的,non-changeable因此对该类属性也是没有意义的
★unsettable attribute 有时候我们希望某个属性处于未设置值的状态,这种状态跟初始化设置的默认值不同(默认情况下,我们会认为属性未设置和属性为默认值两种状态是一样的),当unsettable为ture时,emf generator会追踪指定attribute的设置状态,是未设置,还是已被设置,同时还提供了unsetXxxx()方法来将attribute恢复到未设置状态。对于multi-valued attribute则将unsettable相关的工作交给InternalEList.Unsettable处理,使用unsettable所带来的一个后果就是因为需要相应的属性来保留状态,因此生成的类会比较大。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics