2009-07-29 12 views
5

In tutto il nostro progetto, abbiamo questo tipo di enumerazioni. Funzionano bene, ma non ne siamo sicuri.è la mia enumerazione corretta?

In particolare con il metodo getDocumentType (String).

C'è un modo per evitare l'iterazione su tutto il campo Enums?

public enum DocumentType { 

    UNKNOWN("Unknown"), 
    ANY("Any"), 
    ASSET(Asset.class.getSimpleName()), 
    MEDIA(Media.class.getSimpleName()), 
    MEDIA35MM(Media.class.getSimpleName() + " 35mm"); 


    private String label; 

    private DocumentType(String label) { 
     this.label = label; 
    } 

    public String getLabel() { 
     return label; 
    } 

    public static DocumentType getDocumentType(String label){ 
     for(DocumentType documentType : DocumentType.values()){ 
      if(documentType.getLabel().equals(label)){ 
       return documentType; 
      } 
     } 
     return UNKNOWN; 
    } 
} 

Edit: controllare la risposta newacct. Anche lei sta bene.

+1

Si sarebbe tentati di memorizzare una statica Mappa di etichette da enum casi, ma frustrante, Java non ti consente di riferimento a un campo statico dal costruttore di un enum. – skaffman

+1

Mi chiedo perché usi Asset.class.getSimpleName() invece di scrivere semplicemente "Asset"? Hai intenzione di cambiare il nome con il refactoring? – akarnokd

+1

Perché è sempre buona norma usare i letterali di classe invece delle stringhe? – skaffman

risposta

5

Dovrai fare questa iterazione da qualche parte, a causa delle restrizioni nella scrittura di enumerazioni. In un mondo ideale, popolerai una mappa statica dal costruttore di DocumentType, ma ciò non è permesso.

Il meglio che posso suggerire è di eseguire l'iterazione una volta in un inizializzatore statico, e memorizzare le enumerazioni in una tabella di ricerca:

public enum DocumentType { 

    .... existing enum stuff here 

    private static final Map<String, DocumentType> typesByLabel = new HashMap<String, DocumentType>(); 
    static { 
     for(DocumentType documentType : DocumentType.values()){ 
      typesByLabel.put(documentType.label, documentType); 
     } 
    } 

    public static DocumentType getDocumentType(String label){ 
     if (typesByLabel.containsKey(label)) { 
      return typesByLabel.get(label); 
     } else { 
      return UNKNOWN; 
     } 
    } 
} 

Almeno non farà l'iterazione ogni volta, anche se io dubito che vedrai miglioramenti significativi delle prestazioni.

+0

+1 Proprio quello a cui stavo pensando, mi hai battuto però =) – mikek

+1

Ho appena trascorso 10 minuti o giù di lì urlando al compilatore – skaffman

+0

Se ci sono 100 elementi di enum (o anche migliaia) allora questo potrebbe essere un miglioramento delle prestazioni ...potrebbe, specialmente se stai osservando molto. – aperkins

1

Per quanto ne so (per quello che vale), questo è il modo migliore per fare ciò che vuoi.

Ecco come lo farei almeno.

Se il valore del tuo enum cresce in modo significativo (paio di centinaia - migliaia) si consiglia di aggiungere un Map zione di Strings-enums per fare il look-up un po 'più veloce. Ma per la piccola quantità di eunums che hai, questo potrebbe essere eccessivo.

1

Mi sembra soddisfacente.

Vorrei lasciare l'iterazione così com'è. Certo, è possibile aggiungere un'implementazione "etichetta", "DocumentType"> Mappa alla classe enum e fare una ricerca, ma non aumenterà significativamente le prestazioni.

1

Se le stringhe sono noti al momento della compilazione, e se sono identificatori validi, si può semplicemente li usano come i nomi delle enumerazioni direttamente:

public enum DocumentType { Unknown, Any, Asset, Media, Media35mm } 

e poi garantita entro .valueOf(). Per esempio:

String label = "Asset"; 
DocumentType doctype; 
try { 
    doctype = DocumentType.valueOf(label); 
} catch (IllegalArgumentException e) { 
    doctype = DocumentType.Unknown; 
} 
+0

Un collega stava arrivando con la stessa soluzione. Va bene per la maggior parte del tempo, non nel nostro caso preciso, ma per la successiva iterazione verificheremo se realmente abbiamo un identificatore e un'etichetta. –

Problemi correlati