2010-04-11 30 views
7

En mi aplicación, uso algunos iconos. ¿Dónde debería almacenar la ruta del directorio que contiene esos íconos?¿Dónde almacenar variables globales como rutas de archivos en Java?

Los iconos se utilizan en diferentes clases, por lo que no tiene sentido almacenarlos en una de esas clases en particular.

leí que las variables globales son malas, pero ¿es aceptable el uso de una clase (por ejemplo Commons) que contiene sólo public static final campos para almacenar este rey de los datos? ¿Qué solución se usa en aplicaciones profesionales?

las variables globales

Respuesta

7

constantes globales

Como estado de los demás, las constantes globales no tienen la misma connotación negativa como variables globales. Las variables globales dificultan la depuración y el mantenimiento de un programa debido a modificaciones incontroladas. Las constantes globales (public static final) no crean el mismo problema

Sin embargo, la orientación al objeto se trata de un código de enlace cercano a sus datos para mejorar la comprensibilidad y el mantenimiento. Aún debe encontrar el equilibrio correcto entre el almacenamiento de valores de configuración global en una clase global y el mantenimiento de datos cercanos al código que lo usará.

Probablemente también valga la pena recordar aquí que, debido a que el compilador puede alinear algunas constantes, si cambia un valor constante, es posible que deba recompilar y volver a implementar más que la clase que contiene las constantes.

Valores exteriorizar

También preguntaron sobre qué aplicaciones profesionales lo hacen. No es raro que esas aplicaciones creen estos tipos de valores, como rutas de archivos, externamente configurables. Depende de la probabilidad de que cambie el valor (es decir, de la probabilidad de que se mueva su aplicación o de que se use su código en otra aplicación) y de cuán conveniente o fácil es recompilar y volver a implementar el código con nuevos valores. Si elige hacer algunos valores externamente configurables, puede que quiera codificar los valores predeterminados para esos elementos en el código.

Aquí hay algunas maneras de externalizar esos valores y algunos enlaces para que pueda comenzar. Esto por supuesto no es una lista exhaustiva:

4

están mal (ya que hacen que sea casi imposible de averiguar quién lo modifica), pero constantes no son malos. public static final String campos están bien, ya que no se pueden modificar.

+0

Si las "constantes" deben ser configurables, puede tener un bloque de inicialización estático que use una base de datos de Preferencias. –

+2

Esto dificultará la modificación (recarga) de las Preferencias en tiempo de ejecución. También hará que sea imposible realizar pruebas unitarias usando diferentes preferencias. – Avi

1

Las variables globales no son lo mismo que las constantes globales. La razón por la cual las variables globales son malas es porque se pueden cambiar en cualquier parte del código y es muy difícil rastrear los errores que resultan de una variable global que no está en el estado esperado. Las constantes globales siempre estarán en su estado esperado porque nunca se pueden cambiar inadvertidamente.

2

Usted se está refiriendo a las constantes, no a las variables globales, así que no se preocupe porque sean malas, no lo son, porque no cambian.

  • si son utilizados por una clase - colocarlos en esa clase
  • si son utilizados por múltiples clases en un solo paquete - colocarlos en una clase especial
  • si son utilizados por múltiples clases y ellos lógicamente pertenecen a algún lugar, los colocan allí.

Tenga en cuenta que en caso de que estas "constantes" en realidad son configurables, es mejor que pasar un objeto Configuration a los métodos que lo necesitan. Bueno, puede tener la estática en alguna parte, pero desde el punto de vista de la capacidad de prueba es imprescindible inyectarlos/pasarlos.

3

Recomendaría incluirlos (los íconos) con los archivos de su clase en un contenedor, digamos una carpeta llamada recursos y solo el gestor de iconos necesita saber el nombre de las carpetas de recursos dentro de su contenedor.

+0

No estoy seguro de entender lo que quiere decir con "icono de cargador". ¿Es una clase que proporciona métodos estáticos para obtener los iconos? –

0

En general, sugiero que este caso particular sea un problema de empaquetamiento y no haga referencia a los elementos como archivos en el sistema de archivos, sino como elementos en el classpath, y cárguelos a través de un cargador de clases. Esto requiere establecer su ubicación en el classpath de su aplicación.

Entonces solo debería haber una clase que sepa cómo recuperar estos íconos, y todos los demás códigos preguntan a esa clase por los íconos que necesita.