validar recorrer que programacion herencia enum con comportamiento java coding-style enums

que - recorrer enum java



¿Deberías usar siempre enumeraciones en lugar de constantes en Java? (7)

Existe una clase importante de casos en los que debe usar constantes en lugar de enum . Esto es cuando desea hacer aritmética usando las constantes, o compararlas con valores numéricos. Entonces realmente necesitas que la cosa sea una int , long o double .

Por el contrario, si nunca tendría sentido hacer comparaciones aritméticas o numéricas usando una cosa, esa cosa debería ser un objeto en lugar de un número primitivo, por lo que una enum sería más apropiada.

En java <1.5, las constantes se implementarían así

public class MyClass { public static int VERTICAL = 0; public static int HORIZONTAL = 1; private int orientation; public MyClass(int orientation) { this.orientation = orientation; } ...

y lo usarías así:

MyClass myClass = new MyClass(MyClass.VERTICAL);

Ahora, en 1.5 obviamente deberías estar usando enums:

public class MyClass { public static enum Orientation { VERTICAL, HORIZONTAL; } private Orientation orientation; public MyClass(Orientation orientation) { this.orientation = orientation; } ...

y ahora lo usarías así:

MyClass myClass = new MyClass(MyClass.Orientation.VERTICAL);

Lo cual me parece un poco feo. Ahora podría agregar fácilmente un par de variables estáticas:

public class MyClass { public static Orientation VERTICAL = Orientation.VERTICAL; public static Orientation HORIZONTAL = Orientation.HORIZONTAL; public static enum Orientation { VERTICAL, HORIZONTAL; } private Orientation orientation; public MyClass(Orientation orientation) { this.orientation = orientation; } ...

Y ahora puedo hacer esto de nuevo:

MyClass myClass = new MyClass(MyClass.VERTICAL);

Con todas las bondades de enum de tipo seguro.

¿Es este buen estilo, mal estilo o ninguno? ¿Puedes pensar en una mejor solución?

Actualizar

Vilx- fue el primero en resaltar lo que siento que me estaba perdiendo, que la enumeración debe ser un ciudadano de primera clase. En java, esto significa que obtiene su propio archivo en el paquete; no tenemos espacios de nombres. Pensé que esto sería un poco pesado, pero habiéndolo hecho, definitivamente se siente bien.

La respuesta de Yuval está bien, pero realmente no hizo hincapié en la enumeración no anidada. Además, en cuanto a 1.4, hay muchos lugares en el JDK que usan enteros, y realmente estaba buscando una forma de evolucionar ese tipo de código.


¿Sabía que puede importar Orientación y decir

MyClass myClass = new MyClass(Orientation.VERTICAL);

?


Depende de cuántos valores pueda tomar la enumeración. En tu ejemplo, con solo dos, solo usaría un booleano. Si la enumeración solo será utilizada por el código que usted escribe y no tendrá que interactuar con muchos otros códigos, tal vez no necesite seguridad de tipo. Pero si se trata de un método "público", definitivamente iré a enumeraciones y pondré la enumeración en su propio archivo.


No sé sobre Java, pero en .NET, la buena práctica es poner enumeraciones en paralelo a la clase que las usa, incluso si solo una clase lo utiliza. Es decir, escribirías:

namespace Whatever { enum MyEnum { } class MyClass { } }

Por lo tanto, puedes usar:

MyClass c = new MyClass(MyEnum.MyValue);


Estoy de acuerdo en que fue creativo, pero creo que no es una solución práctica y creo que acaba de cambiar la "fealdad" a una parte diferente del código. ¿Qué sucede si además de VERTICAL y HORIZONTAL, también tienes DIAGONAL, AA, BB, CC, etc.? ¿Tendrá que duplicar escribiendo cada una de las constantes estáticas? ¿Su sabor de que MyClass.Orientation.VERTICAL es feo podría ser personal?


También puede tener dos métodos estáticos en MyClass:

MyClass.Vertical() : MyClass MyClass.Horizontal() : MyClass

Esos devolverán una nueva instancia con el conjunto de enumeración adecuado.


Lo has complicado demasiado. Vamos a juntarlo todo.

Después de Java 1.5 debes usar la clase Java Enum:

public enum Color { BLACK, WHITE; }

Pre Java 1.5 deberías usar el patrón Enum seguro para tipos:

public class Color { public static Color WHITE = new Color("white"); public static Color BLACK = new Color("black"); private String color; private Color(String s) { color = s; } }

En ambos sentidos lo llamas así:

drawBackground(Color.WHITE);

Específicamente, con respecto a su pregunta. Es una cuestión de estilo de código, pero creo que la forma preferida es mantener enumeraciones en sus clases separadas. Especialmente una vez que comienzan a obtener sus propios métodos como getName() , getId() , etc. ... Piense en ello como el mismo dilema que la clase regular frente a la clase anónima, una vez que la clase comienza a estar desordenada, es hora de moverla a su propio archivo.