2016-07-21 47 views
0

問題/問題是否有可能在EMF中擁有ESuperType的POJO?

給出一個簡單的Java類與非EMF感知API來如

public class BankAccount { 
    String ownerName; 
    int accountNumber; 

    // ... 
} 

,也讓我們假設我不允許更改或重新編譯這個類(因爲它來自API)。

是否有任何簡單的方法可以將此類用作EMF中的EClass的ESuperType? (當然,單個類只是一個例子,我需要包裝一個由30-50個類組成的API ...)。

自己的想法

就個人而言,我認爲這是不可能的開箱。

我只能想到兩種方式,都有相當的努力,不容易實現。

  1. 創建反映原類(EBankAccount,具有ownerNameaccountNumber作爲EAttributes)Ecore模型和公用方法/機制,通過複製其字段到對應EStructuralFeatures包裝了原始對象,並將EAdapter S的負責同步兩個對象。

  2. 掛鉤到EMF.CodeGen中,並在那裏做一些魔術,這樣就可以在生成的代碼中使原始類作爲超類,同時仍然實現EMF合約(=實現接口等) 。

但也許有一些EMF(或現有的擴展)隱藏功能,沿着這些線做一些事情,我不知道它?

回答

3

我不清楚你真正想要什麼,但我會嘗試描述幾種選擇。

如果您只想擴展POJO(這是問題文本的建議),則答案爲YES,您可以簡單地向模型添加新的EClass,並在「實例類型名稱」中引用POJO限定名稱「屬性。然後你可以創建其他的類,但是它的狀態不會被EMF管理。

但是,如果您希望EMF跟蹤該POJO狀態,就好像它是一個真正的EMF對象(因此這些屬性也是EStructuralFeature),那麼我看不到另一個解決方案,您真的需要在EMF中完全建模。

在這第二種情況下,您描述的兩個選項似乎都是可能的。

  1. 您所描述的第一個選項(我假設你的意思是你要的2個對象,而不是2類同步)似乎是最容易的,我不認爲它會採取這麼多的努力如果你通過反射使用一些通用的方法。
    如果您在非常具體的位置獲得物體,這可能是一個很好的解決方案,因此您只需要在特定位置打包和解包。否則,你將需要轉換轉換(包裝/解包)對象。

  2. 這可能是也可能的,但它需要更多的努力是肯定的,因爲它不容易擴展Java JET模板

我不知道任何擴展這一點。

+0

+1爲「實例類型名稱」屬性。我從來沒有用過它。我會玩弄它,看看它有什麼... –

相關問題