快速业务通道

基于反射机制的EMF模型比较 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
anceof 操作符首先区分出列表类型,然后再区分出组 合数据类型,余下的作为简单数据类型处理。区分 EList 是因为它是一种集合 数据类型,需要进行遍历其中元素。比较 EList 的方法将在第 3.4 节中详细叙 述。

基于反射机制的EMF模型比较(4)

时间:2011-09-09 IBM 石立川 王芹华 邵兵

比较简单数据类型

通常,基本类型多以“==”操作符比较,但是“==”操作符在比较对象时是 按地址进行比较,所以此操作符并不适用于比较如 String 这样的简单数据类型 。按内容比较简单类型应选择 java.lang.Object 的 equals() 方法。由于 Java 自 5.0 版本新增加了自封箱(Autoboxing)特性,即 Java 编译器会在需 要时对所有基本数据类型做自封箱操作,比如将 int 自封箱为 Integer 对象, 将 boolean 自封箱为 Boolean 等。利用这个特性,只要将得到的值赋给 Object,由 Java 编译器去判断是否做自封箱处理,之后调用 equals 方法对两 个对象进行比较即可,省去了对基本数据类型的判断和使用“==”操作符比较的 繁琐步骤。比较简单数据的示例代码如清单 3:

清单 3. 用 equals 比较简单类型的数据

Object remoteValue = remote.eGet(feature);   Object localValue = local.eGet(feature);   if (remoteValue != null && localValue != null)  {    if (!remoteValue.equals(localValue)) {      // remote value and local value are different    }   }

比较组合数据类型

对于组合数据类型,需要把其分解为简单数据类型比较。组合数据类型的字 段有可能仍是组合数据类型,所以需要进行递归分解。另外由于对象之间可能有 循环的关联关系,所以需要把已经比较过的对象放进备忘录,在每比较一个对象 之前先检查备忘录中是否已经记录了该对象,以避免程序陷入无限循环之中。

列表 (EList) 的比较算法可以简单概括为:求两个列表的差集,差集中的每 个元素都是一个比较的差异项;把两个列表的交集元素按组合类型或者简单类型 算法进行比较。清单 4 给出了比较列表的代码片断。

清单 4. 比较列表 EList

if (remote.eGet(feature) instanceof Elist || local.eGet (feature) instanceof Elist)          { // if the value is a list            compare((EList) remote.eGet(feature), (EList)  local                .eGet(feature), compareType,  compareLog);          }   private void compare(List remote, List local, int  compareType,                        List<CompareInfo>  compareLog) {     if (local == null || local.isEmpty()) {       if (remote == null || remote.isEmpty())         return;       for (int i = 0; i < remote.size(); i++) {         EObject eo = (EObject) remote.get(i);         compareLog.add(new CompareInfo (CompareInfo.REMOTE_ADD,                            compareType,  eo, null));       }       return;     }     for (int i = 0; i < remote.size(); i++) {       EObject remoteObject = (EObject) remote.get(i);       EObject localObject = findElementByID(local,  remoteObject);       if (localObject != null) {         compareT((EObject) remoteObject, localObject,  compareType,compareLog);   

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号