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?
risposta
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.
Grazie mille per una risposta così dettagliata e piacevole. – Waqas
E il confronto delle prestazioni tra enumerati e costanti? – Waqas
@ 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. –
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.
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)
@Jon Skeet: Che cosa ne pensi? – Waqas
A volte la sicurezza del tipo vale il costo del "sovraccarico aggiunto". –
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.
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.
- 1. perché utilizzare costanti stringa vs costanti enum?
- 2. Perché Phobos usa enum per le costanti?
- 3. Perché gli Enum sono stati compilati come costanti anziché come valori statici?
- 4. Perché utilizzare Function.prototype.bind anziché Function.prototype.call?
- 5. Perché utilizzare GWT.create() anziché nuovo?
- 6. Perché utilizzare AsQueryable() anziché List()?
- 7. Perché utilizzare singleton anziché statico?
- 8. Perché utilizzare Celery anziché RabbitMQ?
- 9. Perché utilizzare typedef anziché #defines?
- 10. Espressioni costanti da un Enum
- 11. C# Enum o costanti int
- 12. Perché l'inizializzazione delle costanti enum Java non è completa?
- 13. Perché utilizzare TimeSpan.CompareTo() anziché < > o =
- 14. Perché/Quando utilizzare (!! p) anziché (p! = NULL)
- 15. Perché utilizzare registerDefaults: anziché setValue: forKey :?
- 16. Perché utilizzare rbegin() anziché end() - 1?
- 17. Perché utilizzare il log $ angular anziché console.log?
- 18. Android: perché utilizzare getBaseContext() anziché questo
- 19. Dichiarare le costanti all'interno di enum
- 20. Perché utilizzare un metodo Create anziché utilizzare "nuovo"?
- 21. Una costante enum contiene tutte le costanti enum della stessa classe enum
- 22. Enum anziché le solite classi in Java
- 23. DataStateBehavior per Enum anziché bool? Stringa?
- 24. Un enum può avere costruttori per ciascuna delle sue costanti
- 25. Quando utilizzare ImageButton anziché ImageView?
- 26. Quando utilizzare UICollectionView anziché UITableView?
- 27. Perché le costanti enum devono essere dichiarate prima di qualsiasi altra variabile e dichiarazione dei metodi in un tipo enum?
- 28. Perché dovrei utilizzare il modello di threading "Both" anziché "Free"?
- 29. Perché utilizzare lambda anziché la corrispondenza del modello?
- 30. Perché utilizzare sys.path.append (percorso) anziché sys.path.insert (1, percorso)?
Non vorrei usare una variabile String. Se mai, una variabile 'int' (con costanti ben denominate per i vari tipi). – Thilo
questa risposta ti è utile? http://stackoverflow.com/questions/613837/enums-and-constants-which-to-use-when?rq=1 – Jimmy
possibile duplicato di [Cosa è utile per Enum?] (http://stackoverflow.com/ questions/11393389/what-is-enum-useful-for) – oers