簡體   English   中英

生成返回EMF不可修改列表的方法

[英]Generate method returning EMF Unmodifiable list

我正在通過帶注釋的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不可修改,因此接口客戶端的代碼只能通過add和remove方法修改列表。

有什么干凈的方法可以修改Java批注或genmodel文件,以通知生成器生成返回不可修改列表的代碼? (在谷歌搜索后我找不到它了……)

您如何處理這種情況?

提前致謝

馬努

您將需要修改生成的“ 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(用戶可以輕松使用列表API的全部功能,而不僅僅是添加/刪除)您提供的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM