2009-06-12 1 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 не поддавался модификации, поэтому код клиента интерфейса может изменять только список с помощью методов добавления и удаления.

Есть ли какой-либо чистый способ сделать это. I. Модифицировать аннотацию Java или файл genmodel, чтобы сообщить генератору генерировать код, возвращающий неизменяемый список? (Я не смог найти, что после googling ...)

Как вы управляете такими ситуациями?

Заранее спасибо

Ману

ответ

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 и конфиденциальность, уважение ively. EMF не будет конфликтовать с видимостью, когда он регенерирует этот метод. Кроме того, EMF продолжит генерировать этот суффиксный метод «Gen», хотя теперь у нас есть негенерированный метод getEntityTypes.
  2. Добавлен открытый, негенерированный метод getEntityTypes, который завершает результат реализации по умолчанию в немодифицируемом EList.
  3. Внедрены (и изменены на не сгенерированные) методы add/removeEntityType, делегируя сгенерированный метод getEntityTypesGen (результат которого все еще модифицируется).

Лично я бы не рекомендовал этот подход. EMF обычно возвращает модифицируемые списки для многозначных ссылок, которые клиенты должны изменять, чтобы добавлять или удалять элементы. EMF будет лениво создавать пустой список по мере необходимости, поэтому он делает более чистый интерфейс (не нужно добавлять/удалять методы) и хороший API (пользователь имеет всю полноту API-интерфейса списка под рукой, а не просто добавляет/удаляет которые вы предоставляете).