Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con Properties

Estas en el tema de Problema con Properties en el foro de Java en Foros del Web. Buenas a todos. Tengo un problema con respecto al "uso" del Properties. Vereis, tengo un pequeño programa y había pensado en usar un archivo Properties ...
  #1 (permalink)  
Antiguo 12/01/2013, 09:01
 
Fecha de Ingreso: julio-2012
Ubicación: Madrid
Mensajes: 95
Antigüedad: 11 años, 9 meses
Puntos: 2
Problema con Properties

Buenas a todos.

Tengo un problema con respecto al "uso" del Properties.

Vereis, tengo un pequeño programa y había pensado en usar un archivo Properties para cargar tanto ciertos valores de su configuración como todos los mensajes que dicho programa mostraría en su ejecución.

Lo que tengo, entonces, son dos clases: "Mensajes" y "Parámetros"

En mensajes, tengo los mensajes declarados de la siguiente forma:

Código PHP:
public static final String MENSAJE_BIENVENIDA properties.getProperty("MENSAJE_BIENVENIDA"
Y así, con todos los mensajes (que son unos 50)

Con los parámetros, que llegan a ser unos 3, igual:

Código PHP:
public static final int NUMERO_USUARIO 
El problema llega ahora:
Como tanto los parámetros como los mensajes lo carga de un Properties, digamos que lo primero que debe de hacer mi programa es cargar un objeto con dicho Propeties. Lo hago de la siguiente manera:

Código PHP:
properties = new Properties();
        try{
            
properties.load(new FileInputStream("programa.properties"));
        }catch(
IOException ex) {
            
ex.printStackTrace();
        } 
Y claro, no tengo ni idea de dónde crear este objeto Properties (como solo lo usaría en las clases mencionadas antes, tendría que ser un atributo privado) Pero como tengo dos clases en la que uso el Properties, ¿debería de meter el código anterior en cada una de las clases, teniendo así dos objetos Properties en mi programa?

Otra problema que sucede es que nada mas iniciar mi aplicación, está va a saco a llamar al Properties para inicializar las constantes del programa y puesto que aun no ha cargado ningún Properties, da error.

En resumen, me gustaría saber cómo y dónde:
1. Nada mas iniciar mi aplicación, cree un objeto con los datos del Properties.
2. Después de lo anterior, que se vaya inicializando las constantes del programa con dicha información del Properties (pero como dichas constantes están en dos clases, ¿debería de tener dos objetos Properties en mi programa?)

¡Gracias!
  #2 (permalink)  
Antiguo 12/01/2013, 10:38
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Problema con Properties

Lo que necesitas es aplicar el patrón singleton

http://es.wikipedia.org/wiki/Singleton

Hay varias maneras de hacerlo, una muy sencilla


Código Javascript:
Ver original
  1. public class Config {
  2.  
  3. private static Properties props;
  4.  
  5. public static String getProperty(String property){
  6.  
  7. if(props==null) {
  8. Creas el objeto properties y lo referencias con props
  9. }
  10.  
  11. return props.getProperty(property);
  12.  
  13.  
  14. }

Evidentemente tienes que añadir los controles de errores, y para llamarlo desde cualquier sitio sólo tienes que poner Config.getProperty(nombrePropiedad)
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 12/01/2013, 11:05
 
Fecha de Ingreso: julio-2012
Ubicación: Madrid
Mensajes: 95
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: Problema con Properties

Mira, no sabía ni que existía esto del Singleton, ¡gracias!

Ahora, con lo mismo, me salta la siguiente duda:

¿El Singleton de problema a la hora de "inicializar" variables FINAL de mi aplicacion?
Como comenté, tengo los mensajes de mi programa y ciertas variables guardados en el Properties y lo que quiero es que esos mensajes y variables, se almacenen en variables FINAL de mi programa (para que en vez de estar llamando al Properties cada vez que quiera sacar un mensaje, todos los mensajes queden "guardados" en variables)

No se si me he explicado muy bien...
  #4 (permalink)  
Antiguo 12/01/2013, 16:54
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Problema con Properties

¿Por qué ibas a tener problema?

Aunque te parezca extraño, lo habitual es que se guarde como static final el nombre de la variable (no el contenido) y recuperar del properties el contenido cada vez que lo necesites

Config.getProperty(Mensajes.BIENVENIDA)

public static String BIENVENIDA = "saludo.es"

Y en el fichero de properties

saludo.es=Hola
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #5 (permalink)  
Antiguo 13/01/2013, 03:14
 
Fecha de Ingreso: julio-2012
Ubicación: Madrid
Mensajes: 95
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: Problema con Properties

Cita:
Iniciado por Xerelo Ver Mensaje
Lo que necesitas es aplicar el patrón singleton

http://es.wikipedia.org/wiki/Singleton

Hay varias maneras de hacerlo, una muy sencilla


Código Javascript:
Ver original
  1. public class Config {
  2.  
  3. private static Properties props;
  4.  
  5. public static String getProperty(String property){
  6.  
  7. if(props==null) {
  8. Creas el objeto properties y lo referencias con props
  9. }
  10.  
  11. return props.getProperty(property);
  12.  
  13.  
  14. }

Evidentemente tienes que añadir los controles de errores, y para llamarlo desde cualquier sitio sólo tienes que poner Config.getProperty(nombrePropiedad)
Al final, me ha quedado la cosa así:

Código PHP:
public class ArchivoProperties {
    
    private static 
Properties properties;
    
    
// El constructor privado no permite que se genere un constructor por defecto
    // (con mismo modificador de acceso que la definición de la clase) 
    
private ArchivoProperties(){
        throw new 
AssertionError("No se permite crear ejemplares de esta clase.");    
    }
    
    public static 
String getProperty(String property){
        if(
properties == null) {
            
properties = new Properties();
            try{
                
properties.load(new FileInputStream("datos.properties"));
            }catch(
IOException ex) {
                
ex.printStackTrace();
            }
        }
        return 
properties.getProperty(property);
    }

Y no me da error al "inicializar" los mensajes.

Pero me vuelve a plantear la duda:

Lo que me gustaría es que nada mas arrancar mi aplicación, lo primero que hiciese ésta es buscar el archivo Properties (y si no lo encuentra, dar un error y terminar porque la aplicación no puede funcionar sin este archivo)
Porque según lo que acabo de hacer, hasta que no se llama al método getProperty no comprueba (ni crea) dicho objeto Properties

¿Cómo haría eso?
  #6 (permalink)  
Antiguo 13/01/2013, 10:35
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Problema con Properties

Eso ya está hecho.

Has puesto un catch para capturar el error de que el fichero no exista, si en él añades un System.exit(1) la aplicación termina.

¿Que quieres que sea lo primero que haga? Pues en tu main pon que lo primero que se ejecute sea una llamada a ese método, o si quieres ser más elegante crea un método en config así

public static void isPropertiesloaded() {
getProperties("");
}

y lo llamas.

También podrías no poner el system.exit en el catch y que este método devuelva un true o false y tomar la decisión de acabar en el sitio donde lo llames, o dentro del catch lanzar una excepción.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.

Etiquetas: clase, programa, properties, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:16.