metodo che restituisce EMF lista immodificabile Genera
-
13-09-2019 - |
Domanda
Sto usando campi elettromagnetici attraverso codice Java annotato come 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);
Dopo aver creato file ECORE e genmodel da questa interfaccia annotata, e dopo la generazione del codice il metodo getEntityTypes viene modificato come segue:
public EList<String> getEntityTypes();
fini incapsulamento Voglio che questo elist sia immodificabile, quindi il codice del client interfaccia può modificare solo la lista attraverso aggiungere e rimuovere i metodi.
C'è un modo pulito per farlo cioè la modifica delle annotazioni Java o il file genmodel a dire il generatore per generare il codice di ritorno elenco non modificabile? (Ero in grado di trovare che dopo googling ...)
Come si fa a gestire tali situazioni?
Grazie in anticipo
Manu
Soluzione
Si avrebbe bisogno di modificare la classe generata "Impl" per assomigliare a questo:
/**
* <!-- 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);
}
Si noti che ho fatto il seguente:
- cambiato nome e la visibilità del metodo del getEntityTypes generato per getEntityTypesGen e private, rispettivamente. EMF non pasticcio con la visibilità quando si rigenera questo metodo. Inoltre, FEM continuerà a generare questo "Gen" metodo, anche se ora abbiamo un metodo non-generated getEntityTypes suffisso.
- Aggiunto un pubblico, il metodo getEntityTypes non-generated che avvolge risultato l'implementazione di default in un elist non modificabile.
- Implementazione (e cambiato non generata) metodi aggiuntivo / removeEntityType delegando al metodo getEntityTypesGen generato (il cui risultato è ancora modificabile).
Personalmente, però, non vorrei raccomandare questo approccio. EMF ritorna generalmente liste modificabili per i riferimenti più valori che si suppone clienti di modificare al fine di aggiungere o rimuovere elementi. EMF sarà pigramente creare un elenco vuoto, se necessario, in modo che rende per un'interfaccia più pulita (non è necessario aggiungere / rimuovere metodi) e un bel API (utente ha il pieno potere della lista API a portata di mano, invece di solo l'Aggiungi / Rimuovi che fornite).