IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Properties - modificiation valeur sans redémarrage


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2010
    Messages : 32
    Par défaut Properties - modificiation valeur sans redémarrage
    Bonjour à tous,


    Dans le code de mon client, j'ai défini une classe MyPropertyLoader afin de pouvoir utiliser (lecture, écriture, modification) un fichier .properties contenant des entrées classiques type CLEF=VALEUR :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    public class MyPropertyLoader {
     
        private static final String CONF_FILE = "config/core.properties";
        private static Properties coreProperties = null;
     
     
        public static String getProperty(String key) {
            if (coreProperties == null) {
                loadCoreProperties();
            }
     
            return coreProperties != null ? coreProperties.getProperty(key) : null;
        }
     
     
        public static void setProperty(String key, String value) {
            if (coreProperties == null) {
                loadCoreProperties();
            }
     
            coreProperties.setProperty(key, value);
        }
     
     
        public static void savePropertiesFile() {
            FileOutputStream fos = null;
     
            try {
                fos = new FileOutputStream(CONF_FILE);
     
                coreProperties.store(fos, null);
            } catch (FileNotFoundException fnfe) {
                ... ;
            } catch (IOException ioe) {
                ... ;
            } finally {
                if (fos != null) {
                    try {
                        fos.close();
                    } catch (IOException e) {
                        ... ;
                    }
                }
            }
        }
     
     
        private static synchronized void loadCoreProperties() {
            if (coreProperties == null) {
                InputStream propsIs = null;
     
                try {
                    File file = new File(CONF_FILE);
     
                    if (file.exists()) {
                        propsIs = new FileInputStream(CONF_FILE);
                        coreProperties = new Properties();
                        coreProperties.load(propsIs);
                    } else {
                        System.err.println(CONF_FILE.concat(" not found on your disk !!!"));
                    }
                } catch (IOException ioe) {
                    System.err.print("MyPropertyLoader initialization error : ".concat(ioe.getMessage()));
                    ioe.printStackTrace();
                } finally {
                    if (propsIs != null) {
                        try {
                            propsIs.close();
                        } catch (IOException ioe) {
                            System.err.print("MyPropertyLoader stream closing error : ".concat(ioe.getMessage()));
                            ioe.printStackTrace();
                        }
                    }
                }
            }
        }
     
    }
    Admettons que, dans une autre classe appelée Toto, je définisse un attribut de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Toto {
     
        private static String valeur1 = MyPropertyLoader.getProperty("clef1");
     
        ...
     
    }
    Si pour une raison ou une autre, la valeur d'une des propriétés est modifiée (via des appels aux méthodes MyPropertyLoader.setProperty et MyPropertyLoader.savePropertiesFile), alors le fichier est correctement mis à jour mais la valeur de l'attribut dans la classe Toto n'est pas modifiée...

    Est-ce qu'il y a moyen de forcer un genre de reload de l'attribut (sans redémarrer le client) ?

    Merci,
    Mildju

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Une petite remarque, toutes tes méthodes de la classe sont static, autant rendre la classe en elle même static, tu trouves pas?
    Dis nous, pourquoi as tu besoin dans la classe Toto de déclarer une propriété qui peut être modifiable en static, pourquoi ne pas simplement faire ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyPropertyLoader.getProperty("clef1")
    quand t'as besoin d'une valeur, ainsi tu es certain que les valeurs seront tout le temps à jour.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2010
    Messages : 32
    Par défaut
    1. Et comment fait-on pour déclarer la classe comme static ? Est-ce toujours recommandé ?

    2. How stupid I am ! Merci DevServlet, je rentre me cacher loin sous la terre...

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    T'es pas stupide,c'est ainsi qu'on apprend. Tu peux laisser tes méthodes telles quelles.

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par DevServlet Voir le message
    Une petite remarque, toutes tes méthodes de la classe sont static, autant rendre la classe en elle même static, tu trouves pas?
    Par classe static, tu veux dire non instanciable ? Parce que le concept n'est pas défini.

    Dis nous, pourquoi as tu besoin dans la classe Toto de déclarer une propriété qui peut être modifiable en static, pourquoi ne pas simplement faire ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyPropertyLoader.getProperty("clef1")
    quand t'as besoin d'une valeur, ainsi tu es certain que les valeurs seront tout le temps à jour.
    À ce moment là, si tu réutilises toujours la même valeur, il est plus sain de créer une méthode locale, histoire de pouvoir modifier à un seul endroit et de rendre le code plus lisible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Toto {
     
        public static String getValeur1() {
            return MyPropertyLoader.getProperty("clef1");
        }
     
        ...
     
    }

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Par classe static, tu veux dire non instanciable ? Parce que le concept n'est pas défini.
    Oui classe non instanciable...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static String getValeur1() {
            return MyPropertyLoader.getProperty("clef1");
        }
    Mauvaise idée, s'il a 100 valeurs à recupérer, il fera 100 méthodes dans Toto?? Ceci suffit au moment où il a besoin de sa propriété :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyPropertyLoader.getProperty("clef1")
    Pour sécuriser l'unicité de la modification d'une propriété il peut mettre un synchronized sur la méthode setProperties de sa classe MyPropertyLoader. Ca me parait censé

  7. #7
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    J'imagine que s'il avait créé une donnée membre, c'est parce que c'est utilisé beaucoup de fois dans son code.

    Je doute qu'il ait 100 valeurs de ce type, et ce genre de méthodes permet quand même de rendre le code plus lisible et plus maintenable.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 09/08/2007, 23h28
  2. valeur sans espaces
    Par ktano dans le forum Oracle
    Réponses: 2
    Dernier message: 29/03/2007, 14h16
  3. [Oracle 10g] liste de valeurs sans doublons
    Par gojira dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/10/2006, 16h18
  4. Réponses: 12
    Dernier message: 20/08/2006, 22h35
  5. affectation de valeur sans changement de page
    Par clancy182 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/05/2006, 17h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo