método retornando lista EMF não modificável gerar
-
13-09-2019 - |
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
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:
- 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.
- Adicionado um público, método getEntityTypes não-gerado que envolve o resultado da implementação padrão em uma elist unmodifiable.
- 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).