2010-01-16 63 views
19

¿Cuáles son algunas ventajas de hacer enum en Java similar a una clase, en lugar de solo una colección de constantes como en C/C++?Enum en Java. Ventajas?

+0

Comprobar http://stackoverflow.com/questions/1419835/understanding-enums-in-java/1419849#1419849 – Narayan

Respuesta

24

Obtiene tiempo de compilación libre de valores válidos. Usando

public static int OPTION_ONE = 0; 
public static int OPTION_TWO = 1; 

no asegura

void selectOption(int option) { 
... 
} 

sólo aceptará 0 o 1 como valor de parámetro. Usando una enumeración, eso está garantizado. Además, esto conduce a un mayor código de autoedición, porque puede usar la finalización del código para ver todos los valores enum.

+0

Esta respuesta golpea la principal ventaja , pero ignora muchas otras ventajas que se detallan en otras respuestas. – DJClayworth

4

Las enumeraciones ya son class in Java.

Si está preguntando por qué esto es mejor, yo diría que me vendría a la mente un mejor tipo de seguridad y la posibilidad de agregar otros atributos además de un mero valor ordinal.

0

Las enumeraciones son un tipo en sí mismo: no se puede usar una enumeración que no existe, o poner en alguna otra constante de aspecto similar. y también, puedes enumerarlos, para que el código pueda ser más conciso.

usando constantes estáticas podría potencialmente causar pesadillas de mantenimiento, especialmente si se extienden área.

11

La seguridad de tipo es una de las razones.

Otro, that I find more important, es que puede adjuntar metadatos a valores enum en Java. Por ejemplo, se puede usar una enumeración para definir el conjunto de las operaciones legales para un servicio web, y luego adjuntar metadatos para el tipo de solicitud y datos de la clase:

AddItem(HttpMethod.POST, ProductEntry.class), 
+2

Tenga cuidado con esto. A menudo he visto personas que usan enumeraciones con atributos en lugar de clases.Esto puede llevar al código circundante que usa la enumeración de naturaleza muy extraña y estática (tratando de inyectar objetos de manera efectiva en las enumeraciones), ya que son increíblemente entusiastas para mantener la enumeración en lugar de convertir dicha enumeración en una clase adecuada y tomar el golpe de refactorización. – DaveC

+1

Eso parece bastante patológico; me gustaría ver un ejemplo. Entonces quizás algunas reglas estén en orden: sin estado mutable y sin comportamiento. – kdgregory

3

Además de una mejor seguridad de tipos, también se puede definir comportamiento personalizado en sus enumeraciones (consulte Effective Java para algunos buenos ejemplos).

1

Haciendo enumeración un tipo de referencia que puede contener conjunto fijo de constantes ha llevado a eficiente Mapa aplicación como EnumMap y Establecer aplicación como EnumSet (clases de JDK).

De javadoc de EnumMap:
Una implementación Mapa especializada para su uso con teclas de tipo de enumeración. Todas las claves en un mapa enum deben provenir de un único tipo de enumeración que se especifica, explícita o implícitamente, cuando se crea el mapa. Los mapas de Enum están representados internamente como matrices. Esta representación es extremadamente compacta y eficiente.

EnumMap combina la riqueza y la seguridad del tipo de Mapa con la velocidad de una matriz (Effective Java).

0

La única real ventaja es que se puede utilizar en una declaración switch. Todas las otras cosas de las que puede hacer una enumeración se pueden hacer simplemente con la clase simple de vainilla con un constructor private cuyas instancias a su vez se declaran como campos public static final de la clase en cuestión (el patrón de tipo seguro). La otra ventaja de enum es, obviamente, que hace que el código sea menos detallado de lo que harías con una clase normal simple.

Pero si no me equivoco, en C++ (¿o era C#?) Puede usar String en una declaración switch. Entonces, esa ventaja de las enumeraciones en Java es insignificante en comparación con C++. Sin embargo, lo mismo se propuso para Java 7, no estoy seguro si lo hará.

6

Java 5 enums originó a partir de un patrón typesafe enum de Joshua Bloch 's Effective Java (la primera edición) para evitar las trampas de enumeraciones en C/C++/C# (que son simplemente apenas velado constantes int) y el uso en Java de constantes int estáticas finales.

constantes Principalmente int e INT enumeraciones no son typesafe. Puede pasar cualquier valor int. En C/C++ se puede hacer esto:

enum A { one, two, three }; 
enum B { beef, chicken, pork } b = beef; 

void func(A a) { ... } 
func((A)b); 

Desafortunadamente el patrón de seguridad de tipos enum de Java eficaz tenían un montón de repetitivo, no todo evidente. Lo más notable es que tuvo que anular el privado método readResolve para detener la creación de nuevas instancias en deserialización de Java, lo que rompería la verificación de referencia simple (es decir, utilizando el operador == en lugar de equals()).

Así Java 5 enumeraciones ofrecen estas ventajas sobre los enteros:

  • Seguridad de tipos;
  • Java 5 enumeraciones pueden tener un comportamiento e implementar las interfaces;
  • Java 5 enumeraciones tienen algunas estructuras de datos extremadamente ligeros como EnumSet y EnumMap.

Java 5 enumeraciones más de estas ventajas con respecto a simplemente usando clases:

  • menos repetitivo propenso a errores (constructor privado, readResolve() etc);
  • Corrección semántica. Ves que algo es una enumeración y sabes que solo representa un valor. Ves una clase y no estás seguro. Tal vez hay un método de fábrica estático en alguna parte, etc. Java 5 enumeraciones indican mucho más claramente la intención.
+0

No es un gran problema anular 'readResolve()'. Hago esto regularmente para clases con un número finito de instancias. A veces 'enum' simplifica la definición de esas clases, a veces no. Use la herramienta correcta para el trabajo. – finnw

2

Puede utilizar enumeraciones para aplicar eficazmente Singleton ^^:

public enum Elvis { 
    INSTANCE 
} 
+1

-1 - debe evitar los singletons, no encontrar formas de "implementarlos efectivamente" (este enfoque, por cierto, realiza la inicialización del tiempo de carga, que es increíblemente doloroso de depurar) – kdgregory

+1

Solo quería señalar que SI necesita/desea para usar Singletons, esta es la mejor manera de hacerlo en Java – helpermethod

+9

BTW, Singletons DO tienen sus usos – helpermethod

0

Ventajas del uso de enumeraciones: Un objeto puede ser creado para trabajar de la misma manera como una enumeración. De hecho, las enumeraciones ni siquiera se incluyeron en el lenguaje Java hasta la versión 5.0. Sin embargo, las enumeraciones hacen que el código sea más legible y proporcionan menos espacio para el error del programador. Guía

OCA Java SE 7 programador I Estudio