3

次のように、注釈付きの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 ファイルを変更して、変更不可能なリストを返すコードを生成するようにジェネレーターに指示する方法はありますか? (ググっても見つけられませんでした…)

そのような状況をどのように管理しますか?

前もって感謝します

マヌー

4

1 に答える 1

5

生成された「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. デフォルトの実装の結果を変更不可能な EList にラップする、パブリックで生成されていない getEntityTypes メソッドを追加しました。
  3. 生成された getEntityTypesGen メソッド (結果は引き続き変更可能) に委譲することにより、add/removeEntityType メソッドを実装 (および非生成に変更) しました。

ただし、個人的には、このアプローチはお勧めしません。EMF は通常、クライアントが項目を追加または削除するために変更する必要がある多値参照の変更可能なリストを返します。EMF は必要に応じて空のリストを遅延して作成するため、よりクリーンなインターフェイス (メソッドの追加/削除は必要ありません) と優れた API (ユーザーは追加/削除だけでなく、リスト API のすべての機能をすぐに利用できます) になります。あなたが提供する)。

于 2009-06-13T19:17:12.707 に答える