2010-03-04 27 views
5

Esto podría ser un problema antiguo y estoy seguro de que todos tienen sus propias maneras. Supongamos que tengo algunas propiedades definidas comoPropiedades de Java: ¿exponer o no exponer?

secret.user.id=user 
secret.password=password 
website.url=http://stackoverflow.com 

Supongamos que tengo 100 clases y lugares en los que tenga que utilizar estas propiedades diferentes. Cuál es bueno (1) Creo una clase Util que cargará todas las propiedades y las servirá usando una constante de clave Tales como: Util es un singleton que carga todas las propiedades y mantiene la llamada getInstance().

Util myUtil = Util.getInstance(); 
String user = myUtil.getConfigByKey(Constants.SECRET_USER_ID); 
String password = myUtil.getConfigByKey(Constants.SECRET_PASSWORD); 
.. 
//getConfigByKey() - inturns invokes properties.get(..) 
doSomething(user, password) 

Entonces, donde sea que necesite estas propiedades, puedo hacer los pasos anteriores.

(2) Creo una clase significativa para representar estas propiedades; por ejemplo, ApplicationConfig y proporciona getters para obtener propiedades específicas. Así código anterior puede verse como:

ApplicationConfig config = ApplicationConfig.getInstance(); 
doSomething(config.getSecretUserId(), config.getPassword()); 
//ApplicationConfig would have instance variables that are initialized during 
// getInstance() after loading from properties file. 

Nota: El archivo de propiedades como tal tendrá sólo cambios menores en el futuro.

Mi elección personal es (2) - déjame escuchar algunos comentarios?

+0

¿Las propiedades no se almacenarían en caché de todos modos, por lo que no se penalizaría el rendimiento si se cargaba en varios lugares diferentes? – willcodejavaforfood

+0

¿Por qué placa de la caldera? No creo que sea una buena sugerencia. También tenga en cuenta que etiqueté esto con el diseño del programa. Me gusta el código que funciona bien y también funciona bien. –

Respuesta

1

encuentro el primer acercamiento a ser más detallado de lo necesario. (Especialmente si no se espera que las propiedades cambien mucho). Además, al usar el segundo enfoque, puede manejar problemas de conversión/tipo cuando las propiedades se cargan en lugar de cuando se usan.

+0

Me gustó el punto de fundición. –

0

Supongo que mi primera pregunta es por qué quieres crear una instancia de algo que dices es un singleton (lo mencionaste usando un código como Util.getInstance()). Un singleton solo tiene 1 instancia, por lo que no debe tratar de crear instancias de copias múltiples en su código.

Si los datos son estáticos (como esto parece) crearía un singleton y recuperaría los valores de él.

+1

Esa * es * una de las formas en que accede a una instancia de singleton. – alphazero

+0

De acuerdo, Util.getInstance(). WhateverMethod .. es suficiente. Las copias creadas (si alguna vez lo hice realmente fueron solo por la claridad del código) Pero su respuesta no fue completa. En ambos casos, tengo singleton.La pregunta es si utilizar un enfoque basado en Constant KEY o modelar algunas clases que proporcionarán getters –

0

No creo que haya ninguna ventaja significativa de un método sobre el otro y no creo que la solución (1) sea más segura, solo porque proporciona una clave de propiedad en lugar de un captador de Java para obtener contraseñas .

Si tuviera que elegir una, tomaría la opción (2).

+0

hm. Creo que myUtil.getConfigByKey (Constants.SECRET_PASSWORD); es tan seguro o (menos para el caso) como: config.getPassword() –

+1

Está de acuerdo en que es tan seguro (o menos). Si myUtil se escribió correctamente y se mejoró la seguridad de JVM (para evitar la reflexión/inspección de variables privadas), entonces podría ser * bastante * seguro –

2

hacerlo de la manera más sencilla (una clase con valores estáticos):

package com.domain.packagename 

public class Properties { 
    private static String hostName; 
    public static getHostName() { return hostName; } 
    private static int port; 
    public static int getPort() { return port; } 

    public static void load() { 
     //do IO stuff, probably 
     hostName = ??; 
     port = ??; 
     //etc 
    } 
} 
+1

Votado 1, ya que es una buena idea. Se puede crear una clase inmutable para representar las propiedades tales como: Configuración de clase pública { public final String userId; final pública contraseña de cadena; public int int timeOut; privado estático Configuración CONFIG = null; privados de configuración (puntales Bien) {// código para pueblan variables finales // alguna galimatías Singleton} getInstance static() {// ... } –

1

Su opción (2) para mantener los captadores específicos de la aplicación suena mejor y más limpio. Las claves finales estáticas públicas de una interfaz han sido un mal diseño en Java durante años.

+0

¡Sí! A mí tampoco me gustan las claves finales estáticas públicas de una interfaz –

Cuestiones relacionadas