Comment fusionner deux objects java.util.Properties?

J’essaie d’avoir un object java.util.Properties par défaut dans ma classe, avec les propriétés par défaut qu’il accepte, et de laisser le développeur en remplacer certains en spécifiant un autre object java.util.Properties , mais je n’ai pas pu trouver bonne façon de le faire.

L’utilisation prévue est la suivante:

 Properties defaultProperties = new Properties(); defaultProperties.put("key1", "value1"); defaultProperties.put("key2", "value2"); Properties otherProperties = new Properties(); otherProperties.put("key2", "value3"); Properties finalProperties = new Properties(defaultProperties); // // I'd expect to have something like: // // finalProperties.merge(otherProperties); // 

java.util.Properties implémente l’interface java.util.Map . Vous pouvez donc le traiter comme tel et utiliser des méthodes telles que putAll pour append le contenu d’une autre Map .

Cependant, si vous le traitez comme une carte, vous devez faire très attention à ceci:

 new Properties(defaultProperties); 

Cela attire souvent les gens, car cela ressemble à un constructeur de copie, mais ce n’est pas le cas. Si vous utilisez ce constructeur, puis appelez quelque chose comme keySet() (hérité de sa super-classe Hashtable ), vous obtiendrez un ensemble vide, car les méthodes Map des Properties ne tiennent pas compte de l’object Properties par défaut constructeur. Les valeurs par défaut ne sont reconnues que si vous utilisez les méthodes définies dans Properties lui-même, telles que getProperty et propertyNames , entre autres.

Donc, si vous avez besoin de fusionner deux objects Propriétés, il est plus sûr de le faire:

 Properties merged = new Properties(); merged.putAll(properties1); merged.putAll(properties2); 

Cela vous donnera des résultats plus prévisibles, plutôt que d’étiqueter arbitrairement l’un d’eux comme l’ensemble de propriétés “par défaut”.

Normalement, je recommanderais de ne pas traiter les Properties comme une Map , car c’était (à mon avis) une erreur d’implémentation depuis les débuts de Java (les propriétés auraient dû contenir une Hashtable , pas étendue). L’interface définie dans Properties elle-même ne nous donne pas beaucoup d’options.

En supposant que vous souhaitiez éventuellement lire les propriétés d’un fichier, je choisirais de charger les deux fichiers dans le même object de propriétés comme:

 Properties properties = new Properties(); properties.load(getClass().getResourceAsStream("default.properties")); properties.load(getClass().getResourceAsStream("custom.properties")); 

Tu es presque bon:

 Properties defaultProperties = new Properties(); defaultProperties.setProperty("key1", "value1"); defaultProperties.setProperty("key2", "value2"); Properties finalProperties = new Properties(defaultProperties); finalProperties.setProperty("key2", "value3"); 

EDIT: remplacé par setProperty .

Oui, vous avez raison, invoquez simplement la méthode putAll et vous avez terminé.

putAll (): Copie tous les mappages de la carte spécifiée sur cette hashtable. Ces mappages remplaceront tous les mappages que cette table de hachage avait pour l’une des clés actuellement dans la carte spécifiée.

 Properties merged = new Properties(); merged.putAll(properties1); merged.putAll(properties2); 

La ligne 2 n’a aucun effet. Aucune des propriétés du premier fichier ne sera dans l’object de propriétés fusionnées.