59 votes

Comment fusionner deux java.util.Les propriétés des objets?

Je suis d'essayer d'avoir une valeur par défaut java.util.Properties objet dans ma classe, avec les propriétés par défaut il accepte, et pour permettre au développeur de remplacer certains d'entre eux en spécifiant un autre java.util.Properties objet, mais je ne pouvais pas trouver un bon moyen pour 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);
//

126voto

skaffman Points 197885

java.util.Properties implémente l' java.util.Map interface, et vous pouvez juste le traiter comme tel, et l'utilisation de méthodes comme putAll pour ajouter le contenu d'un autre Map.

Toutefois, si vous le traitez comme une Carte, vous devez être très prudent avec ce:

new Properties(defaultProperties);

Cela se produit fréquemment, car il semble comme un constructeur de copie, mais il n'est pas. Si vous utilisez le constructeur, et ensuite appeler quelque chose comme keySet() (hérité de son Hashtable super-classe), vous obtiendrez un ensemble vide, parce que l' Map méthodes Properties ne tiennent pas compte de la valeur par défaut Properties objet que vous avez passé dans le constructeur. Les valeurs par défaut ne sont comptabilisés que si vous utilisez les méthodes définies dans Properties lui-même, comme getProperty et propertyNames,, entre autres.

Donc, si vous avez besoin de fusionner deux Propriétés des objets, 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 de manière arbitraire l'étiquetage de l'un d'entre eux comme le "par défaut" jeu de propriétés.

Normalement, je vous recommande de ne pas traiter Properties comme Map, parce que c'était (à mon avis) une mise en œuvre erreur dès les premiers jours de Java (Propriétés doivent être Hashtable, non étendu il - qui était paresseux design), mais la faiblesse de l'interface définie en Properties lui-même ne nous donne pas beaucoup d'options.

19voto

EJB Points 1192

En supposant que vous avez finalement voudrais lire les propriétés d'un fichier, j'irais pour charger les deux fichiers dans le même propriétés de l'objet comme:

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

4voto

Jerome Points 5318

Vous êtes 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é put par setProperty.

1voto

Volker B. Points 31

putAll(): Les Copies de tous les mappages de la carte spécifiée pour cette table de hachage. Ces mappages de remplacer tous les mappages que cette table de hachage a 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 à partir du premier fichier sera fusionné les propriétés de l'objet.

1voto

OscarRyz Points 82553

Oui vous avez raison, il suffit d'invoquer la putAll méthode et vous avez terminé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X