Ambos ints
y enums
pueden usar tanto el interruptor como si-luego-else, y el uso de la memoria también es mínimo para ambos, y la velocidad es similar; no hay diferencias significativas entre ellos en los puntos que ha planteado.
Sin embargo, la diferencia más importante es la comprobación de tipo. Enums
están marcados, ints
no lo son.
Considere este código:
public class SomeClass {
public static int RED = 1;
public static int BLUE = 2;
public static int YELLOW = 3;
public static int GREEN = 3; // sic
private int color;
public void setColor(int color) {
this.color = color;
}
}
Mientras que muchos clientes utilizarán esto correctamente,
new SomeClass().setColor(SomeClass.RED);
No hay nada que les impida escribir esto:
new SomeClass().setColor(999);
Hay tres problemas con el uso del patrón public static final
:
- El problema se produce en tiempo de ejecución, no compilar tiempo, así que va a ser más caro para arreglar, y más difícil encontrar la causa
- Tienes que escribir código para controlar el mal de entrada - típicamente una
if-then-else
con una final else throw new IllegalArgumentException("Unknown color " + color);
- una vez más caros
- No hay nada que impida una colisión de constantes - el código de la clase anterior se compilará a pesar de que
YELLOW
y GREEN
ambos tienen el mismo valor 3
Si utiliza enums
, que abordan todos estos problemas:
- Su código no se compilará a menos que pase los valores válidos en
- No hay necesidad de ningún código especial "mala entrada" - manejará el compilador eso para usted
- valores de enumeración son únicos
pregunta relacionada: http://stackoverflow.com/questions/4709175/why-and-what-for- java-enum/4709224 # 4709224 – sleske