邋遢居

          我的Java天堂

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks

          在八進(jìn)制的中講述了從模型到應(yīng)用程序的生成過(guò)程。我通過(guò)類似的方法生成了一個(gè)應(yīng)用程序。

          代碼生成后,我就想看看EMF為我生成了什么樣的代碼。我如果需要修改的話該如何修改。

          我的“Hellow world”是采用的“Using EMF”文中的模型。
          familytree.JPG
          根據(jù)這個(gè)模型建立了一個(gè)EMF Model
          family model.gif
          根據(jù)這個(gè)模型生成model class的結(jié)構(gòu)如下圖所示:
          class code.gif

          從圖中我們可以看到有三個(gè)包:

          他們分別是:family,family.implfamily.util。

          familyfamily.impl包之間的差別就是一個(gè)是Interface,另外一個(gè)是這些Interface的實(shí)現(xiàn)。

          我們先來(lái)看看我們模型中出現(xiàn)過(guò)的類:

          Family,FamilyTree,Female,Male以及Individual。

          由于我是采用Annotated Java的方式生成的模型。所以在family包中的代碼并沒有太多的變化。
          /**
               * Return the father
               * 
          @return the father
               * @model
               
          */
              Male getFather();
              
              
          /**
               * Sets the value of the '{
          @link com.jet.swt.emf.family.Family#getFather <em>Father</em>}' reference.
               * <!-- begin-user-doc -->
               * <!-- end-user-doc -->
               * 
          @param value the new value of the '<em>Father</em>' reference.
               * 
          @see #getFather()
               * @generated
               
          */
              
          void setFather(Male value);

          他只是為我提供了Set方法。接口的繼承也沒有做修改。但是他對(duì)應(yīng)的實(shí)現(xiàn)類就有了很多變化。

          首先從類的申明來(lái)看:

          public class FamilyImpl extends EDataObjectImpl implements Family {
          我們可以看到我們的FamilyImpl是從EdataObjectImpl類繼承而來(lái)。處于好奇我有在Hiberarchy中打開他的繼承關(guān)系看了一下。hiberarchy.gif

          這里有一張圖可以清晰的說(shuō)明這個(gè)繼承關(guān)系的職能。

          hiberachyfunction.gif
          我例子中的Business Layer是FamilyImpl類。

          這樣我們的就可以不寫一行代碼就可以使我們的對(duì)象具有Notification/Common的功能(關(guān)于NotificationCommon的功能到底是怎樣的,我會(huì)在后續(xù)的學(xué)習(xí)筆記中記下來(lái)。呵呵,是不是很爽啊)。另外在《Eclipse Modeling Framework: A Developer's Guide》一書的第二章也有提到這部分的內(nèi)容,不過(guò)由于他講解的EMF的版本比較老和我現(xiàn)在使用的版本有點(diǎn)出入,不過(guò)基本的功能還是講到了。

          好了,看完申明我們就來(lái)繼續(xù)往下看吧。

          Family下面有三個(gè)屬性,father,motherchildren

          EMF給我們生成的對(duì)應(yīng)的代碼為:

          protected Male father = null;

              
          /**
               * The cached value of the '{
          @link #getMother() <em>Mother</em>}' reference.
               * <!-- begin-user-doc -->
               * <!-- end-user-doc -->
               * 
          @see #getMother()
               * @generated
               * @ordered
               
          */
              
          protected Female mother = null;

              
          /**
               * The cached value of the '{
          @link #getChildren() <em>Children</em>}' containment reference list.
               * <!-- begin-user-doc -->
               * <!-- end-user-doc -->
               * 
          @see #getChildren()
               * @generated
               * @ordered
               
          */
              
          protected EList children = null;

          以及一些getset方法。

          對(duì)于set方法中除了基本的賦值以外還加上了向所有對(duì)這次變動(dòng)感興趣觀察者發(fā)送一個(gè)變更消息:

          public void setFather(Male newFather) {
                  Male oldFather 
          = father;
                  father 
          = newFather;
                  
          if (eNotificationRequired())
                      eNotify(
          new ENotificationImpl(this, Notification.SET, FamilyPackage.FAMILY__FATHER, oldFather, father));
              }

          對(duì)于get方法要分基本類型還是對(duì)象這兩種類型來(lái)處理。

          如果是基本類型,直接返回就好了。

          如:

          public String getName() {
                  
          return name;
              }
          如果是對(duì)象的話就有點(diǎn)麻煩了。先要判斷該對(duì)象是否使用了代理(這一部分我還不是太清楚)如果是的話就獲得他的代理對(duì)象,并判斷獲得代理對(duì)象是否和當(dāng)前對(duì)象是否相等,如果不等就發(fā)送一個(gè)變更消息。最終返回對(duì)象(肯能是一個(gè)代理對(duì)象)。
          public Male getFather() {
                  
          if (father != null && ((EObject)father).eIsProxy()) {
                      Male oldFather 
          = father;
                      father 
          = (Male)eResolveProxy((InternalEObject)father);
                      
          if (father != oldFather) {
                          
          if (eNotificationRequired())
                              eNotify(
          new ENotificationImpl(this, Notification.RESOLVE, FamilyPackage.FAMILY__FATHER, oldFather, father));
                      }
                  }
                  
          return father;
              }

          還有其他類將在下一篇記下。

          1、  Using EMF,  Author :Catherine Griffin

          2、   EMF介紹系列(二、從模型生成應(yīng)用程序) Author:八進(jìn)制

          3、  Mastering Eclipse Modeling Framework,Author:Vladimir Bacvanski(Vladimir@inferdata.com) Petter Graff(petter@inferdata.com)

          Eclipse Modeling Framework: A Developer's Guide Author:Frank Budinsky, David Steinberg, Ed Merks, Raymond Ellersick, Timothy J. Grose
          posted on 2005-12-18 13:12 Jet Geng 閱讀(3963) 評(píng)論(4)  編輯  收藏 所屬分類: EMF

          Feedback

          # re: EMF 生成的Model Code閱讀筆記(一) 2006-01-01 21:09 lanserzhao
          java,myeclipse,struts,spring,hibernate技術(shù)論壇群9967568,歡迎各位加入  回復(fù)  更多評(píng)論
            

          # re: EMF 生成的Model Code閱讀筆記(一) 2006-01-05 13:24 水狐
          我也來(lái)踩踩 真是好文啊  回復(fù)  更多評(píng)論
            

          # re: EMF 生成的Model Code閱讀筆記(一) 2006-05-03 22:05 綠色使者、綠色心情
          恩,過(guò)一段來(lái)仔細(xì)研究一下EMF  回復(fù)  更多評(píng)論
            

          # re: EMF 生成的Model Code閱讀筆記(一) 2006-06-17 10:06 re
          推薦插件搜索站點(diǎn) : http://www.eclipsepowered.net  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 论坛| 登封市| 浪卡子县| 渭南市| 呼玛县| 东源县| 冕宁县| 金川县| 英德市| 大丰市| 巴彦县| 青冈县| 收藏| 和平县| 灵丘县| 思茅市| 玉林市| 澜沧| 蕉岭县| 宁河县| 兴仁县| 剑川县| 正宁县| 瓦房店市| 日照市| 会泽县| 镇巴县| 喜德县| 疏勒县| 清苑县| 浑源县| 灵武市| 贵定县| 喜德县| 沂南县| 五台县| 南木林县| 和硕县| 信宜市| 安福县| 赤峰市|