2012-07-09 20 views
10

Dopo aver letto alcune domande e risposte su enum, non lo trovo davvero utile ...A cosa serve Enum?

È qualcosa tra classe e variabile ma so dove posso usarlo quindi sarebbe più utile di una classe, o un paio di variabili per esempio.

+6

http://stackoverflow.com/questions/481068/when-to-use-enum-or-collection-in-java – Habib

+1

http://stackoverflow.com/questions/2077634/enum-in-java-advantages – assylias

risposta

32

Ci sono altre cose che puoi fare e dei motivi per usarle, ma il motivo principale per cui utilizzo le enumerazioni è di impedire la possibilità di un parametro non valido. Per esempio, immaginate il seguente metodo:

public void doSomethingWithAMonth(int monthNum); 

Questa non è ambiguo solo (? Fare gli indici mese partono da 1 oppure a 0), ma si può dare dati non validi in basso a destra (13+, i numeri negativi) . Se si dispone di un enum Month con Jan, Feb, ecc la firma diventa:

public void doSomethignWithAMonth(Month month); 

Codice di chiamare questo metodo sarà molto più leggibile, e non può fornire dati non validi.

+1

Grazie! Ora penso di capirlo un po 'meglio :) –

+1

Questo è un esempio semplice e buono – njfife

2

Come per il nome "enum", è ideale per le costanti di enumerazione, che forniscono funzionalità estese. Ad esempio è possibile memorizzare alcune costanti comprendenti diversi parametri come: constantId, constanNameString, parametri aggiuntivi. Inoltre enum può contenere funzioni.

Un uso esotico di enum è quello di fare un singleton.

4

Un enum imposta i codificatori per selezionare da un elenco predefinito di entità o concetti. Mentre si può raggiungere lo stesso obiettivo con le classi o impostare una variabile su un particolare valore noto, un'enumerazione è meno soggetta a errori poiché pubblicizza e impone un menu da cui il setter di un valore può scegliere.

4

Un Enum è utile per impedire alle persone di fare cose che non dovrebbero fare. Per esempio, se ho:

public final static int WEATHER_SUNNY = 0; 
public final static int WEATHER_RAINY = 1; 
public final static int WEATHER_HAIL = 2; 

allora posso fare: MyClass.WEATHER_SUNNY + MyClass.WEATHER_HAIL che non ha senso. Ecco perché è meglio avere un enume meteorologico. Ciò rende il codice più leggibile e non consente di sommare due interi del tempo.

+0

Non sono un grande fan di questo esempio se non solo per il motivo che ritengo che incoraggi un pensiero ristretto. Non c'è motivo per cui diversi tipi di tempo come questo non si sovrappongano, anzi, spesso lo fanno. – Thor84no

+0

@ Thor84no: grazie per il tuo commento. Tuttavia, tutto dipende dal dominio e dall'applicazione, quindi dire cose come "incoraggia il pensiero ristretto". non sembra appropriato –

10

Uso Enum per tutto ciò che ha più "tipi" non modificanti di qualcosa. I giorni della settimana

Perché non uso String in questo caso è perché non posso fare l'istruzione di switch su String e posso su Enum, quindi per ogni giorno della settimana posso fare qualcosa di specifico.

Io uso anche Enum quando si lavora con pattern Singleton, Controllare il Effective Java book CH2(CHAPTER 2 CREATING AND DESTROYING OBJECTS), citazione:

"Anche se questo approccio deve essere ancora ampiamente adottato, un tipo enum singolo elemento è il modo migliore per attuare un Singleton ". non incollerò il codice, leggo il libro, è eccellente

Se fossi in te, prima leggevo il testo Thinking in java Tipi enumerati. Quindi dopo questo efficace capitolo 6 di Java e dovresti essere buono

2

Enum è utile quando hai un elenco di valori che sono funzionalmente significativi e finiti.

Supponiamo per esempio che è necessario utilizzare un giorno della settimana: un altro giorno non verrà aggiunto e preferiremmo avere Giorno.LUNEDI nel tuo codice piuttosto che un numero e dovendo ricordare che 0 è lunedì, 1 martedì e così via. Rende interruttore dichiarazione più facile da capire anche, con:

Switch(day) { 
    case Monday : ... break; 
    case Tuesday : ... break 
    etc. 
} 
3

vorrei aggiungere alle altre risposte che enumerazioni sono classi che hanno solo un numero fisso di istanze. Queste istanze possono contenere campi e metodi e possono essere utilizzate come qualsiasi altro oggetto Java. Ad esempio, l'enum Month potrebbe definire metodi come

public int getNumberOfDays(int year); 
public boolean isFirstOfYear(); 
7

più semplice definizione - An enum is just like any other class, with a predefined set of instances.

parte migliore enum è che può essere utilizzato in istruzioni switch in cui non possiamo usare le stringhe.

e Enum è un tipo sicuro, pertanto non è possibile assegnare un nuovo valore al runtime.

+1

Solo per chi si imbatte in questo, come in Java 7, non è più vero che non si possa usare 'String's nelle istruzioni' switch'. http://docs.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.html – Thor84no