2012-07-20 31 views
37

Ho uno scenario in cui sono presenti i tipi di giocatore ARCHER, WARRIOR e lo stregone. Cosa dovrei usare nella classe del giocatore? Una variabile String per tipo o un Enum? Perché enum e perché stringhe costanti. Si prega di aiutare con le ragioni.Perché utilizzare enum anziché costanti?

+1

Non vorrei usare una variabile String. Se mai, una variabile 'int' (con costanti ben denominate per i vari tipi). – Thilo

+3

questa risposta ti è utile? http://stackoverflow.com/questions/613837/enums-and-constants-which-to-use-when?rq=1 – Jimmy

+0

possibile duplicato di [Cosa è utile per Enum?] (http://stackoverflow.com/ questions/11393389/what-is-enum-useful-for) – oers

risposta

73

si supponga di utilizzare stringhe costanti (o int valori - lo stesso vale per loro):

// Constants for player types 
public static final String ARCHER = "Archer"; 
public static final String WARRIOR = "Warrior"; 

// Constants for genders 
public static final String MALE = "Male"; 
public static final String FEMALE = "Female"; 

poi si finisce per non sapendo il tipo dei dati - che porta a codice potenzialmente errato:

String playerType = Constants.MALE; 

Se si utilizza enumerazioni, che sarebbe finire come:

// Compile-time error - incompatible types! 
PlayerType playerType = Gender.MALE; 

Allo stesso modo, le enumerazioni dare un insieme limitato di valori:

String playerType = "Fred"; // Hang on, that's not one we know about... 

vs

PlayerType playerType = "Fred"; // Nope, that doesn't work. Bang! 

Inoltre, le enumerazioni in Java possono avere più informazioni ad essi associati, e può anche avere un comportamento. Molto meglio a tutto tondo.

+3

Grazie mille per una risposta così dettagliata e piacevole. – Waqas

+2

E il confronto delle prestazioni tra enumerati e costanti? – Waqas

+0

@ waqas716: le enumerazioni sono tipi di riferimento, ma esiste un solo oggetto per valore, quindi è improbabile che si sprechi molta memoria. Se vuoi altre differenze di prestazioni, devi dire quello che ti interessa. –

8

Gli Enum ti limitano al set di input richiesto mentre anche se si utilizzano stringhe costanti, è possibile utilizzare altro String non incluso nella logica.

Questo ti aiuta a non commettere errori, a inserire qualcosa fuori dal dominio, mentre inserisci i dati e migliora anche la leggibilità del programma.

Inoltre, puoi sempre utilizzare l'enumerazione come stringa se lo desideri. Ecco uno reference.

1

Vorrei consigliarvi di utilizzare le enumerazioni solo se avete veramente bisogno di costanti numerate o di alcune funzionalità aggiuntive comuni a tutti gli articoli.

Ovviamente a seconda del tipo di applicazione che si sta scrivendo e di quali versioni e dispositivi si desidera supportare.

Il motivo è che le enumerazioni aumentano il sovraccarico perché allocano le istanze dei loro articoli. È possibile notare che ci sono enumerazioni minime nella piattaforma Android e quasi tutte le costanti sono ints statici finali (come View.GONE e cose del genere)

+2

@Jon Skeet: Che cosa ne pensi? – Waqas

+0

A volte la sicurezza del tipo vale il costo del "sovraccarico aggiunto". –

3

Oltre a non consentire di fornire un valore errato, c'è ancora un'altra funzionalità di enumerazioni che possono sembrare minori, ma secondo me è piuttosto importante. Gli IDE moderni possono suggerire automaticamente i valori per le enumerazioni, mentre non c'è modo di inferire in modo affidabile i possibili valori di una costante di stringa (Intellij IDEA fa quest'ultimo, ma solo per le classi JDK e le librerie popolari). Ciò è particolarmente utile quando si esplora una nuova API.

0

Enum è meglio utilizzare per la sicurezza del tipo. Non è possibile inserire valori errati. Ma enum in Android richiede tanta memoria, dovresti invece usare intdef. Fare riferimento a questa risposta per esempio e la spiegazione: -

IntDef/StringDef Example

È inoltre possibile controllare il codice sorgente di Android si sta sostituendo le enumerazioni con IntDef/StringDef ove possibile. Ex. View.VISIBLE.

Problemi correlati