Pergunta

Eu estou usando EMF através de código Java anotada como segue

/**
 * 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);

Depois de criar ficheiros ecore e genmodel a partir desta interface anotado, e depois de se gerar o código do método getEntityTypes é modificado como se segue:

public EList<String> getEntityTypes();

Para fins de encapsulamento Quero que este elist ser unmodifiable, portanto, o código do cliente da interface só pode modificar a lista através de métodos adicionar e remover.

Existe alguma maneira limpa para fazer isso ou seja modificando anotação Java ou o arquivo genmodel para dizer o gerador para gerar o código de voltar lista unmodifiable? (I não foi capaz de achar que depois de pesquisar ...)

Como você gerenciar tais situações?

Agradecemos antecipadamente

Manu

Foi útil?

Solução

Você precisa modificar a sua classe gerada "Impl" para olhar como esta:

/**
 * <!-- 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);
}

Note que eu fiz o seguinte:

  1. mudou o nome ea visibilidade do método getEntityTypes gerado para getEntityTypesGen e privado, respectivamente. EMF não vai mexer com a visibilidade quando se regenera este método. Além disso, EMF continuará a gerar este "Gen" método sufixo mesmo que nós temos agora um método não-gerado getEntityTypes.
  2. Adicionado um público, método getEntityTypes não-gerado que envolve o resultado da implementação padrão em uma elist unmodifiable.
  3. Implementado (e alterado para não-gerado) os métodos add / removeEntityType, delegando ao método getEntityTypesGen gerado (cujo resultado ainda é modificável).

Pessoalmente, porém, eu não recomendo essa abordagem. EMF geralmente retorna listas modificáveis ??para referências com vários valores que os clientes deveriam modificar a fim de adicionar ou remover itens. EMF vai preguiçosamente criar uma lista vazia, conforme necessário, por isso, constitui uma interface mais limpa (não precisa adicionar / métodos de remover) e boa API (usuário tem pleno poder da lista de API na ponta dos dedos, em vez de apenas o Adicionar / Remover que você fornece).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top