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

È stato utile?

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:

  1. 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.
  2. Aggiunto un pubblico, il metodo getEntityTypes non-generated che avvolge risultato l'implementazione di default in un elist non modificabile.
  3. 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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top