2009-06-12 73 views
2

我使用EMF通過註釋的Java代碼如下生成方法返回EMF不可修改的列表

/** 
* Adds the given type to this filter. Has no effect if the given type 
* already belongs to this filter. 
* 
* @param type 
*   the type to add 
* @model 
*/ 
public void addEntityType(String type); 

/** 
* Returns the list of types belonging to this filter. Types are identified 
* by there name. 
* 
* @return the list of types for this entity type filter 
* 
* @model 
*/ 
public List<String> getEntityTypes(); 

/** 
* Removes the given type from this filter. Has no effect if the given type 
* doesn't belong to this filter. 
* 
* @param type 
*   the type to remove 
* @model 
*/ 
public void removeEntityType(String type); 

從這個註釋的接口建立的Ecore和這個genmodel文件後,並生成代碼後getEntityTypes方法修改如下:

public EList<String> getEntityTypes(); 

爲了封裝的目的,我希望這個EList是不可修改的,因此接口客戶端的代碼只能通過添加和刪除方法來修改列表。

是否有任何干淨的方式來做到這一點,即修改Java註釋或genmodel文件以告訴生成器生成返回不可修改列表的代碼? (Google搜尋後我無法找到...)

你如何管理這種情況?

在此先感謝

馬努

回答

4

你會需要修改生成的 「默認地將Impl」 類看起來像這樣:

/** 
* <!-- begin-user-doc --> 
* <!-- end-user-doc --> 
* @generated 
*/ 
private EList<String> getEntityTypesGen() { 
    if (entityTypes == null) { 
     entityTypes = new EDataTypeUniqueEList<String>(String.class, 
      this, NsPackage.THINGY__ENTITY_TYPES); 
    } 
    return entityTypes; 
} 

public EList<String> getEntityTypes() { 
    return ECollections.unmodifiableEList(getEntityTypesGen()); 
} 

/** 
* <!-- begin-user-doc --> 
* <!-- end-user-doc --> 
* @generated NOT 
*/ 
public void addEntityType(String type) { 
    getEntityTypesGen().add(type); 
} 

/** 
* <!-- begin-user-doc --> 
* <!-- end-user-doc --> 
* @generated NOT 
*/ 
public void removeEntityType(String type) { 
    getEntityTypesGen().remove(type); 
} 

請注意,我已經做了以下內容:

  1. 將生成的getEntityTypes方法的名稱和可見性更改爲getEntityTypesGen和private,尊重結構延續。重新生成此方法時,EMF不會混淆可見性。此外,即使我們現在有一個未生成的getEntityTypes方法,EMF仍將繼續生成此「Gen」後綴方法。
  2. 添加了一個公共的非生成getEntityTypes方法,該方法將默認實現的結果封裝在一個不可修改的EList中。
  3. 通過委託生成的getEntityTypesGen方法(其結果仍可修改)實現(並更改爲非生成的)add/removeEntityType方法。

雖然我個人不推薦這種方法。 EMF通常會返回客戶應修改以添加或刪除項目的多值引用的可修改列表。 EMF會根據需要懶惰地創建一個空列表,因此它會創建一個更乾淨的界面(不需要添加/刪除方法)和一個不錯的API(用戶可以輕鬆掌握list API的全部功能,而不僅僅是添加/刪除你提供)。