2010-10-14 32 views

Respuesta

1

el uso de interfaces para almacenar constantes es algún tipo de interfaces que abusan.

Pero usar Enums no es la mejor manera para cada situación. A menudo, una simple int o cualquier otra constante es suficiente. Definición de instancias de clases propias ("enumeraciones tipo de fallos") son aún más flexible, por ejemplo:

public abstract class MyConst { 
    public static final MyConst FOO = new MyConst("foo") { 
    public void doSomething() { 
     ... 
    } 
    }; 

    public static final MyConst BAR = new MyConst("bar") { 
    public void doSomething() { 
     ... 
    } 
    }; 

    protected abstract void doSomething(); 

    private final String id; 

    private MyConst(String id) { 
    this.id = id; 
    } 

    public String toString() { 
    return id; 
    } 
    ... 
} 
+0

¿cómo es más flexible que las enumeraciones? también pueden tener métodos específicos constantes (métodos abstractos que implementa cada constante individual). –

4

Sí lo es. Enum es la mejor opción.

Usted está recibiendo de forma gratuita:

  • constantes de
  • objetos inmutables
  • singletons

todo en uno.

Pero espera, hay algunos más. Cada valor enum puede tener sus propios campos y métodos. Es un objeto rico y constante con un comportamiento que permite la transformación en diferentes formas. No solo toString, sino toInt, toWwhat WhichDestination que necesitas.

+3

Y aquí hay una guía sobre cómo usar Enums como constantes http://download.oracle.com/javase/1.5.0/docs/guide/language/enums.html – Joel

2

Enum es mejor para la mayoría de los casos, pero no todo. Algunos podrían estar mejor puestos como antes, es decir en una clase especial con constantes estáticas públicas.

Ejemplo donde enum no es la mejor solución para constantes matemáticas, como PI. Crear una enumeración para eso empeorará el código.

enum MathConstants { 
    PI(3.14); 

    double a;   

    MathConstants(double a) { 
     this.a = a; 
    } 

    double getValueA() { 
     return a; 
    } 
} 

Uso:

MathConstants.PI.getValueA(); 

feo no es así? Comparar con:

MathConstants.PI; 
29

Para números mágicos en el que el número real tiene un significado y no es sólo una etiqueta que, obviamente, no debe usar enumeraciones. Entonces el viejo estilo sigue siendo el mejor.

public static final int PAGE_SIZE = 300; 

Cuando solo está etiquetando algo, usaría una enumeración.

enum Drink_Size 
{ 
    TALL, 
    GRANDE, 
    VENTI; 
} 

a veces tiene sentido para poner todas sus constantes globales en su propia clase, pero yo prefiero ponerlas en la clase que están más estrechamente ligados a. Eso no siempre es fácil de determinar, pero al final del día lo más importante es que tu código funciona :)

+1

Bonita distinción de limpieza aquí para cuándo se usa mejor cada uno – Brian

0

Olvídate de las enumeraciones: ahora, cuando la importación estática está disponible en Java, coloca todas tus constantes en REAL clase (en lugar de interfaz) y luego solo importe los miembros estáticos de todos los demás usando import static <Package or Class>.

+0

¿Puede aclarar por qué deberíamos "olvidarnos de las enumeraciones" y explicar por qué querría importar las constantes de otras clases estáticamente? – allingeek

+0

1. La pregunta era sobre números mágicos. Las enumeraciones no son buenas para los números que se comparan con las constantes estándar; consulte la respuesta de @nanda más arriba. 2. Además, las enumeraciones son decisiones desagradables cuando tienes que almacenar un conjunto de constantes de tipos diferentes. 3. Los enumeraciones se introdujeron inicialmente como un contenedor para _series_ de elementos. Lo que significa que la enumeración describe un conjunto lógico de unidades: meses, días de la semana, planetas, colores del arco iris, etc .; y fue una solución usar enums para constantes para evitar el anti-patrón 'constantes de interfaz'. Ahora ya no es necesario, tenemos importaciones estáticas en su lugar. –

Cuestiones relacionadas