Entre interfaces y enums, ¿cuál es mejor para declarar constantes? ¿Por que es esto entonces?Interfaces vs. enums
Respuesta
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.
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.).
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
@Tedil: el conjunto de características C# 4.0 ha sido finalizado. No incluye las enumeraciones mejoradas de OO. – missingfaktor
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.
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.
- 1. #define vs. enums para direccionar periféricos
- 2. Genéricos vs. Interfaces
- 3. Interfaces vs. clases abstractas
- 4. paquete java.util - classes vs interfaces
- 5. Ampliación de Java Enums
- 6. deserializing enums
- 7. anotaciones de nivel de clase vs interfaces
- 8. Tipos genéricos vs Clase abstracta/Interfaces
- 9. C# y Interfaces - explícitos vs implícito
- 10. 64bit Enums? C#
- 11. Diseño pitónico sin enums
- 12. C# Enums and casting
- 13. WCF Versioning Enums
- 14. enums de Java ordenando
- 15. DataContractJsonSerializer y Enums
- 16. Espacios en C# Enums
- 17. ¿Puedo comparar enums de MySQL?
- 18. ¿Es posible extender Java Enums?
- 19. ¿Cómo almacena MySQL Store Enums?
- 20. dapper nuget 1.7 enumeración enums
- 21. Analizando con elegancia C# Enums
- 22. C# Enums with Flags Attribute
- 23. Java Enums puede tener comportamiento?
- 24. ¿Qué hace '^' en C# (Enums)?
- 25. Entity Framework - Enums persistentes genéricamente?
- 26. estilo de código Java - Interfaces vs. clases abstractas
- 27. Delegados (expresiones Lambda) Vs Interfaces y clases abstractas
- 28. Java Enums: Implementing methods After Declaration?
- 29. ¿Por qué mis enums C# no funcionan?
- 30. ¿Cómo evitar el uso de Enums?
Las constantes 'public static final' son de un tiempo anterior a' enum'. :) – Bombe
@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
Sí, por supuesto, porque la última vez que revisé 'Math' no era una interfaz. – Bombe