2012-07-20 10 views
37

Tengo un escenario en el que tengo tipos de reproductores ARCHER, WARRIOR y hechicero. ¿Qué debería usar en la clase de jugador? Una variable String para tipo o un Enum? Por qué enum y por qué Constant Strings. Por favor ayuda con las razones¿Por qué usar Enums en lugar de Constants?

+1

No utilizaría una variable String. En todo caso, una variable 'int' (con constantes muy bien llamadas para los diversos tipos). – Thilo

+3

es esta respuesta algo bueno para usted? http://stackoverflow.com/questions/613837/enums-and-constants-which-to-use-when?rq=1 – Jimmy

+0

posible duplicado de [¿Para qué sirve Enum?] (http://stackoverflow.com/ preguntas/11393389/what-is-enum-useful-for) – oers

Respuesta

73

supongamos que utiliza cadenas constantes (o int valores - lo mismo vale para ellos):

// 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"; 

entonces termina sin saber realmente el tipo de los datos - que conduce a código potencialmente incorrecto:

String playerType = Constants.MALE; 

Si utiliza enumeraciones, que terminaría como:

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

Asimismo, enumeraciones dar a un conjunto restringido de valores:

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

vs

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

Además, enumeraciones en Java pueden tener más información asociada con ellos, y también puede tener comportamiento. Mucho mejor en todos los sentidos.

+3

Muchas gracias por una respuesta tan detallada y agradable. – Waqas

+2

¿Qué pasa con la comparación de rendimiento entre Enums y Constants? – Waqas

+0

@ waqas716: Los enumeraciones son tipos de referencia, pero solo hay un objeto por valor, por lo que es poco probable que desperdicie mucha memoria. Si quieres otras diferencias de rendimiento, deberías decir lo que te interesa. –

8

Las enumeraciones lo limitan al conjunto de entradas requeridas, aunque incluso si utiliza cadenas constantes, puede utilizar otra cadena que no sea parte de su lógica.

Esto le ayuda a no cometer un error, a ingresar algo fuera del dominio, mientras ingresa datos y también mejora la legibilidad del programa.

Además, siempre puede usar sus enumeraciones como una cadena si lo desea. Aquí hay un reference.

1

Te aconsejaría que uses enumeraciones solo si realmente necesitas constantes enumeradas, o alguna funcionalidad adicional común para todos los artículos.

Eso, por supuesto, depende del tipo de aplicación que está escribiendo y qué versiones y dispositivos desea admitir.

La razón es que las enumeraciones agregan sobrecarga porque asignan instancias de sus elementos. Puedes notar que hay enumeraciones mínimas en la plataforma de Android, y casi todas las constantes son entradas estáticas finales (como View.GONE y cosas por el estilo)

+2

@Jon Skeet: ¿Qué dice al respecto? – Waqas

+0

A veces, la seguridad de tipo vale el costo de la "sobrecarga adicional". –

3

Además de no poder proporcionar un valor incorrecto, existe otra característica de enumeraciones que pueden parecer menores, pero en mi opinión es bastante importante. Los IDE modernos pueden sugerir valores automáticamente para enumeraciones, mientras que no hay forma de inferir de manera confiable los valores posibles de una constante de cadena (Intellij IDEA hace lo último, pero solo para clases JDK y bibliotecas populares). Esto es especialmente útil cuando explora una nueva API.

0

Enum es mejor usarlo para la seguridad del tipo. Los valores incorrectos no se pueden ingresar. Pero enum en Android requiere tanta memoria, debería usar intdef en su lugar. Referirse a esta respuesta para el ejemplo y explicación: -

IntDef/StringDef Example

También puede comprobar el código fuente de Android que está reemplazando las enumeraciones con IntDef/StringDef siempre que sea posible. Ex. View.VISIBLE.

Cuestiones relacionadas