2010-05-02 17 views
8

Estoy haciendo un programa que utiliza un par de constantes. En un primer momento, cada vez que tenía que utilizar una constante, me lo definen comoSingletons y constantes

//C# 
private static readonly int MyConstant = xxx; 

//Java 
private static final int MyConstant = xxx; 

en la clase en la que se iba a necesitar. Después de un tiempo, comencé a darme cuenta de que algunas constantes serían necesarias en más de una clase.

En este momento, yo tenía 3: Oferta de

  1. definirlos en las diferentes clases que lo necesitaban. Esto lleva a la repetición. Si por alguna razón más tarde tengo que cambiar uno de ellos, tendría que verificar en todas las clases para reemplazarlos en todas partes.
  2. Para definir una clase/singleton estático con todas las constantes como públicas.
  3. Si necesitaba una constante en X claseA, ClassB y ClassC, sólo podría definirlo en claseA como pública, y luego tener ClassB y ClassC se refieren a ellos. Esta solución no me parece tan buena ya que introduce aún más dependencias ya que las clases ya las tienen.

terminé implementar mi código con la segunda opción. ¿Es esa la mejor alternativa? Siento que probablemente me esté perdiendo alguna otra alternativa mejor.

Lo que me preocupa de usar el producto único aquí es que no es en absoluto claro para un usuario de la clase que esta clase está utilizando el singleton. ¿Tal vez podría crear una ConstantsClass que tuviera todas las constantes necesarias y luego pasarla en el constructor a las clases que la necesitarían?

Gracias

editar: Estoy usando este sobre todo para este tipo de complejos, no Ints y cuerdas. Al menos en el caso de C# que hace la diferencia, ya que significa que no puedo usar la palabra clave const.

Respuesta

5

No redacción sobre C#, pero en Java existen varias maneras de resolver este problema.

  1. Cambiar el access modifier a los valores predeterminados (paquete solamente) o public. La solución más directa.

  2. Agrúpelos en un paquete privado o publicenum. Más sencillo si esos valores son relacionados entre sí. P.ej. Role.ADMIN, Role.USER, Role.GUEST, etc.

  3. Declararlos en un paquete privado o publicinterface y dejar que las clases lo implementen. Solo haga esto si esas constantes pertenecen a algún contrato las clases tienen que cumplir también.

  4. Colóquelos en properties files y cárguelo como private static final Properties y agregue public static String getProperty(String key). Envuelva esto en algún paquete privado o publicConfiguration clase. Más útil si esas constantes pueden ser sensibles a los cambios que luego podría controlar externamente.

Las constantes no requieren el acceso de una instancia, por lo que toda la idea de singleton no tiene sentido.

+0

Si estuviera en un singleton, no se declararían como estáticos, por supuesto. Simplemente se declararían estáticos si estuvieran en una clase estática o dentro de cada clase que lo necesitaría. –

+1

Entonces esos valores ya no son ** constantes **. No, olvida la idea de singleton. – BalusC

1

Lo definiría en un lugar, en una de las clases que lo necesitaban. Lo haría estático, final y público, por lo que era una constante, accesible para cualquier otro cliente que lo necesitara.

4

Usa un archivo de propiedades y pon las constantes allí.

+1

¿Por qué recibí ¿Dinged? –

0

Un enfoque a este sería el uso de la primavera, disponible tanto en Java y .NET.

www.springsource.org
www.springframework.net - .net

lo contrario que haría uso de un archivo de configuración.

+0

Cuando te refieres a un archivo de configuración, ¿al final te refieres a usar algo así como un Singleton? –

+0

Por configuración me refiero a la ubicación constante en una única ubicación en un archivo separado donde se puede encontrar fácilmente si necesita actualizarse, perteneciendo a la aplicación en lugar de a una clase específica. Si creías que necesitabas un singleton, Spring sería ideal para eso. – McAden

+0

Sí, pero desde el punto de vista del diseño, lo que está haciendo es confiar en algo que termine pareciendo una clase estática. Tiene todas sus clases confiando en un objeto que tiene un estado "global". –

2

ConfigurationManager.AppSettings Property en .Net existe solo por este motivo. Usted pone la configuración en archivos de configuración suponiendo que estos son elementos que desea establecer en un lugar, p. Ej. para un sitio web que utiliza ASP.Net, el sitio web.config es una ubicación en la que se pueden establecer configuraciones para que los entornos de desarrollo, prueba y producción tengan configuraciones diferentes en cuanto a cómo se ejecutan.

+0

Sí, pero eso termina siendo una clase estática, ¿verdad? –

+1

Probablemente, pero mi punto es que hay clases integradas para hacer lo que necesita, entonces, ¿por qué no usarlas? –

2

En lo que int está preocupado por lo general uso un enum en C#

public enum MyMagicNumbers 
{ 
    TheFirst = 1, 
    TheSecond = 2, 
    TheLast = 10, 
} 

Para otros tipos - como BalusC ya se ha mencionado - una clase cerrada es todo lo que necesita

public sealed class MyMagicStuff 
{ 
    private MyMagicStuff() {} 

    public const string TheFirst = "One"; 
    public const string TheSceond = "Two"; 
    public const string TheLast = "Ten"; 
} 
+0

¿Cómo se usarían los datos si no se puede crear una instancia de la clase y los campos no son estáticos? –

+1

@devoured Es suficiente para hacer que 'const' - al menos en C#. – Filburt

+1

No sabía ese hecho. De todos modos, mis tipos son complejos, por lo tanto, no puedo usar el modificador "const" en ellos. –