2008-12-14 16 views
10

en Java < 1.5, constantes serían implementados como estoen caso de que utilice siempre las enumeraciones en vez de constantes en Java

public class MyClass { 
    public static int VERTICAL = 0; 
    public static int HORIZONTAL = 1; 

    private int orientation; 

    public MyClass(int orientation) { 
     this.orientation = orientation; 
    } 
... 

y que lo utilizarían como esto:

MyClass myClass = new MyClass(MyClass.VERTICAL); 

Ahora, en 1,5 obviamente deberías estar usando enumeraciones:

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); 

Que me parece un poco feo. Ahora me podría añadir 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 todos los beneficios de seguridad de tipos de enumeraciones.

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

actualización

Vilx- fue el primero en poner de relieve 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.

+0

En el primer bloque de código, quería dar a cada variable un valor diferente, ¿no? –

+0

¿Realmente necesita la clase MyClass para hacer más que solo las diferentes Orientaciones? –

Respuesta

2

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

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

Por lo tanto, se puede utilizar:

MyClass c = new MyClass(MyEnum.MyValue); 
5

Sabía usted puede importar Orientación y decir

MyClass myClass = new MyClass(Orientation.VERTICAL); 

?

+0

Buen punto. Sí, lo hice, pero eso todavía significa más verbosidad en el código de llamada (agrega una línea de importación). Mi motivación es mantener el código de llamadas más corto y más limpio. – Draemon

+0

Lo siento, hombre. Quiero decir, me encanta Java y todo, pero _shorter_ nunca ha sido una prioridad en este lenguaje. –

+3

Más corto? ¿Qué ... entonces, en lugar de una línea de importación, prefieres escribir MyClass una y otra vez? Eso no es más corto ni más limpio para mí. – arul

0

Depende de cuántos valores de la enumeración puede tomar. 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.

+0

Tiene sentido, pero usar enum es un poco más autodescriptivo que un booleano. –

+0

pero si solo lo está pasando a una función, entonces puede hacer que la firma 'public MyClass (boolean isVertical)'. Sin embargo, ese es el único caso en el que lo usaría. –

27

Lo ha complicado demasiado. Vamos a juntarlo todo.

Mensaje Java 1.5 se debe utilizar la clase Java Enum:

public enum Color 
{ 
    BLACK, WHITE; 
} 

Pre Java 1.5 se debe utilizar el patrón de enumeración de tipo seguro:

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 ambas formas se lo llama así:

drawBackground(Color.WHITE); 

En concreto, en cuanto 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 empiezan a tener 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 pasarla a la suya archivo.

0

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

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

Los devolverá una nueva instancia con el sistema de enumeración adecuada.

0

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?

+0

Acepto que acabo de cambiar la fealdad, pero siempre ligeramente prefiero que se llame en código en lugar de código de llamada. Es absolutamente personal, y ni siquiera estoy seguro de que me guste la alternativa, por eso estoy pidiendo perspectivas. Estoy llegando a la conclusión de que una clase separada sería lo mejor. – Draemon

0

Existe una clase importante de casos en los que debe usar constantes en lugar de enum s. Esto es cuando desea hacer aritmética usando las constantes, o compararlas con valores numéricos. Entonces realmente necesita que sea 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 un enum sería más apropiado.

Cuestiones relacionadas