Question

Je travaille en Java sur un projet assez volumineux. Ma question concerne la meilleure manière de structurer l'ensemble des propriétés de mon application.

Approche 1: Avoir un objet statique de propriétés accessible par toutes les classes. (Inconvénients: certaines classes perdent donc leur généralité si elles sont retirées du contexte de l’application; elles nécessitent également des appels explicites à un objet statique situé dans une classe différente et pouvant à l’avenir disparaître. sentir raison, est-ce que je me trompe?)

Approche 2: les propriétés doivent être instanciées par la classe principale et transmises aux autres classes d’application. (Inconvénients: vous passez un pointeur sur l'objet Properties à presque toutes les classes et il semble devenir très redondant et lourd; je ne l'aime pas .)

Des suggestions?

Était-ce utile?

La solution

J'aime utiliser l'injection de dépendance Spring pour de nombreuses propriétés. Vous pouvez traiter votre application comme des blocs de construction et injecter les propriétés directement dans le composant qui en a besoin. Cela préserve (encourage) l'encapsulation. Ensuite, vous assemblez vos composants et créez la "classe principale".

Un effet secondaire intéressant de l'injection de dépendance est que votre code devrait être plus facilement testable.

Autres conseils

En fait, l'approche 2 fonctionne vraiment bien.

J'ai essayé d'utiliser un objet de propriétés Singleton sur un projet récent. Ensuite, lorsque le temps est venu d’ajouter des fonctionnalités, j’ai besoin de réviser le Singleton et je regrette de devoir localiser tous les endroits où j’ai utilisé MySingleton.getInstance () .

L’approche 2 consistant à faire passer un objet d’information global par l’intermédiaire de vos différents constructeurs est plus facile à contrôler.

L’utilisation d’un setter explicite aide aussi.

class MyConfig extends Properties {...}

class SomeClass {
    MyConfig theConfig;
    public void setConfi( MyConfig c ) {
        theConfig= c;
    }
    ...
}

Cela fonctionne bien et vous serez ravi de savoir précisément quelles classes ont réellement besoin d'informations de configuration.

Si beaucoup de classes ont besoin des propriétés, je choisirais l'approche 1. Ou peut-être une variante dans laquelle vous utilisez le modèle de conception Singleton au lieu de toutes les méthodes statiques. Cela signifie que vous ne devez pas continuer à passer certaines propriétés d'objet autour. D'un autre côté, si seules quelques classes ont besoin de ces propriétés, vous pouvez choisir l'approche 2 pour les raisons que vous avez mentionnées. Vous voudrez peut-être également vous demander quelle est la probabilité que les classes que vous écrivez soient réellement réutilisées et, dans l'affirmative, quel est le problème de réutilisation de l'objet properties. Si la réutilisation n’est pas probable, ne vous en occupez pas maintenant et choisissez la solution la plus simple pour la situation actuelle.

On dirait que vous avez besoin d’un composant du gestionnaire de configuration. On le trouverait via une sorte de localisateur de service, qui pourrait être aussi simple que ConfigurationManagerClass.instance () . Cela résumerait tout ce plaisir. Ou vous pouvez utiliser un framework d'injection de dépendance comme Spring.

Cela dépend beaucoup de la façon dont les composants se trouvent dans votre architecture. Si vos autres composants sont transmis en tant que références, faites-le. Juste être cohérent.

Si vous recherchez quelque chose de rapide, vous pouvez utiliser les propriétés système, elles sont disponibles pour toutes les classes. Vous pouvez stocker une valeur de chaîne ou, si vous devez stocker une liste de "choses", vous pouvez utiliser la méthode System.Properties (). Cela retourne un objet 'Properties' qui est un HashTable. Vous pouvez ensuite stocker ce que vous voulez dans la table. Ce n'est pas joli mais c'est un moyen rapide d'avoir des propriétés globales. YMMV

Je choisis généralement un objet singleton qui réside dans un projet commun et contient une table de hachage lui-même indexée sur un espace de noms, ce qui donne une classe de propriétés pour chacun.

L’injection de dépendance est également un bon moyen de le faire.

Je me sens plus à l'aise lorsque j'ai un pointeur statique sur mes propriétés en mémoire. Parfois, vous souhaitez recharger des propriétés au moment de l’exécution ou d’autres fonctionnalités plus faciles à implémenter avec une référence statique.

Rappelez-vous qu’aucune classe n’est une île. une classe réutilisable peut avoir une classe client pour garder le noyau libre de la référence singletone.

vous pouvez également utiliser des interfaces, essayez simplement de ne pas en faire trop.

L’approche 2 est définitivement meilleure.

Quoi qu'il en soit, vous ne devriez pas laisser une autre classe effectuer une recherche dans un objet config. Vous devez prendre injet config pris dans l’objet config en dehors de l’objet.

Consultez la configuration d'apache commons pour obtenir de l'aide sur la configuration.

Donc, dans le main (), vous pourriez avoir

MyObject mobj = new MyObject();
mobj.setLookupDelay(appConfig.getMyObjectLookupDelay);
mobj.setTrackerName(appConfig.getMyObjectTrackerName);

Au lieu de

MyObject mobj = new MyObject();
mobj.setConfig(appConfig);

où appConfig est un wrapper autour de la bibliothèque de configuration Apache qui effectue toute la recherche de la valeur sur la base du nom de la valeur dans un fichier de configuration.

Ainsi, votre objet devient très facilement testable.

N'a pas utilisé Java pendant un moment, mais vous ne pouvez pas simplement mettre vos propriétés dans les propriétés java.lang.System? De cette façon, vous pouvez accéder aux valeurs de partout et éviter de créer un "global". classe de propriété.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top