2010-03-27 13 views

Respuesta

12

Siempre es mejor utilizar las enumeraciones para declarar constantes ya que el objetivo de las interfaces está en un nivel totalmente diferente. Sí, hay muchas interfaces que tienen una constante public static final, pero creo que el trabajo exclusivo de enumeraciones es proporcionar estas constantes.

+6

Las constantes 'public static final' son de un tiempo anterior a' enum'. :) – Bombe

+5

@Bombe, eso no es del todo cierto. Si, por ejemplo, 'java.lang.Math' se reescribiera hoy,' PI' y 'E' todavía se declararían como' constantes dobles públicas fijas'. – gustafc

+6

Sí, por supuesto, porque la última vez que revisé 'Math' no era una interfaz. – Bombe

2

Las interfaces están diseñadas para definir comportamientos comunes, enumeraciones para definir valores comunes.

Enum representa un valor real que puede compararse con otro valor o almacenarse en la base de datos fácilmente. También puede tener un flag-enum (en C#, no lo sé en Java) que le permite realizar operaciones binarias en los valores de enum (AND, OR, XOR, etc.).

+1

En las enumeraciones Java son básicamente clases (constantes), por lo que puede hacer mucho más con ellas que con enumeraciones en C# antes de .NET 4.0. Creo que C#/.net 4.0 va a implementar esta característica. – Tedil

+0

@Tedil: el conjunto de características C# 4.0 ha sido finalizado. No incluye las enumeraciones mejoradas de OO. – missingfaktor

5

Si hay razones para que sus constantes tengan un tipo específico, si necesitan algún tipo de comportamiento (es decir, métodos) o si son compuestos de otros valores, enum s son el camino a seguir.

Por ejemplo, supongamos que usted está implementando un juego de cartas y que desea representar los valores y trajes:

enum Rank { 
    ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, 
    EIGHT, NINE, TEN, JACK, QUEEN, KING; 
} 
enum Suit { SPADES, CLUBS, DIAMONDS, HEARTS } 

No, ahora es imposible crear tarjetas con trajes falsos o filas.

A veces, sin embargo, solo le interesa que se declaren en algún lugar varios valores de uso frecuente. En ese caso, ponerlos en un enum sería un esfuerzo innecesario, ya que estas constantes son solo una herramienta para evitar que recordemos todos los decimales de, digamos, π cuando estamos calculando la circunferencia de un círculo, o algo así. ¿Qué se ve mejor?

// Using enum: 
enum MathConstant { 
    PI(3.14159265358979323846), E(2.7182818284590452354); 
    private final double value; 
    MathConstant(double v) { value = v; } 
    public double value() { return value; } 
} 
// Usage: 
double circumference = MathConstant.PI.value() * diameter; 

// Using a constant class: 
final class MathConstants { 
    private MathConstants() { throw new UnsupportedOperationException(); } 
    public static final double PI = 3.14159265358979323846, 
           E = 2.7182818284590452354; 
} 
// Usage: 
double circumference = MathConstants.PI * diameter; 

En cuanto a las interfaces: Nunca coloque constantes en una interfaz. El patrón de "interfaz constante" es incorrecto (justification) y el único argumento para usarlo se ha invalidado porque import static se agregó a Java.

0

Si trabaja con Java 5 o posterior, Enum es el camino a seguir. La única excepción es si su lista de const está abierta y puede extenderse. Los mensajes no se pueden extender. Otra excepción es si se trata de valores únicos, como MAX_INTEGER.