constantes globales no son una mala práctica, siempre y cuando que son ...
- ... inmutable - un mundial,
final
/readonly
referencia a un objeto mutable (como una aplicación Java o una ArrayList<T>
C# List<T>
) no es un estado constante, sino global.
- ... necesario por> 1 clase. Si solo una clase necesita tus constantes, coloca las constantes directamente en la clase. (Advertencia: balance de señal vs YAGNI apropiadamente.)
Bloch cubre la "interfaz constante" vs. tema "constante de clase" en Java eficaz, y aboga por el enfoque de "constante de clase". La razón por la que no desea las constantes en una interfaz es que incita a las clases de los clientes a "implementar" esa interfaz (para acceder a las constantes sin incluir el nombre de la interfaz).No deberías, sin embargo, que la interfaz no sea realmente una interfaz para las capacidades del objeto, sino una conveniencia de tiempo de compilación arraigada en el tipo externo de la clase. Considere esto:
interface C { public static final int OMGHAX = 0x539; }
class A implements C { ... }
class B { private A a; }
Clase B
ahora innecesariamente tiene una dependencia a C
. Si la implementación de A
cambia para que no necesite las constantes de C
, no puede eliminar implements C
sin romper su interfaz externa - alguien (posiblemente una persona muy estúpida, pero tales personas abundan) podría hacer referencia a un objeto A
a través de una referencia C
!
Al poner las constantes en una clase, y al hacer que la clase no se pueda desinstalar, informa a los clientes que la clase constante realmente solo funciona como un espacio de nombres secundario. En C# marca la clase como static
, en Java que te gustaría que sea final
y darle una constructora inalcanzable:
final class C {
private C() { throw new AssertionError("C is uninstantiable"); }
public static final int OMGHAX = 0x539;
}
Si programa en Java y desea que las constantes sin un prefijo del nombre de la clase constante, puede usar la funcionalidad import static
.
Y sí, es un poco redundante que se vio obligado a crear un nuevo tipo sólo para tener un lugar para poner sus constantes, pero eso es una verruga en lenguajes como Java y C# que tenemos que hacer frente a - nos tenemos poner nuestras constantes en algún lugar, y nuestra mejor opción es una clase no instanciable.
Sí, pero estoy preguntando acerca de * constantes globales * en realidad. – aberrant80
¿Qué patrones de diseño usan constantes globales? – SwDevMan81
Está hablando de un patrón anti. –