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

Java Discussion :

Injection de propriétés


Sujet :

Java

  1. #1
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut Injection de propriétés
    Bonjour,

    Je cherche comment injecter des propriétés spécifiques à un projet dans des objets fournis par une autre librairie.

    Voici mon cas de figure:

    Ma librairie offre deux classes : MyRepository et MyObject. Et MyRepository possède une méthode retournant un ensemble de MyObject:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<MyObject> myRepository getObjects() {..}
    Mon projet A utilise cette librairie et souhaiterait que les objets retournés par myRepository.getObjects aient une propriété de plus, déduisible des autres propriétés. Cette nouvelle propriété ne doit pas être ajoutée dans le cadre du projet B.

    Quelle est la meilleure façon de faire ?

    Je pensais à ajouter dans la libraire les interfaces et méthodes suivantes :
    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
    public interface ObjectCreator {
        public MyObject create(X x, Y y);
    }
     
    public class MyRepository {
       private ObjectCreator objectCreator=null;
        public void setObjectCreator(ObjectCreator objectCreator) {
          this.objectCreator=objectCreator;
        }
     
       private MyObject createObject(X x, Y y) {
           if (objectCreator != null) return objectCreator.create(x,y);
           else return new MyObject(x,y);
        }
     
        // reste du code existant
        // ...
     
    }
    Et dans le projet A:
    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
    public class ProjetAMain {
       protected void init() {
        // ...
        myRepository.setObjectCreator(new ObjectCreator() {
            public MyObject create(X x, Y y) {
              return new MyObjectA(x,y);
            }
          }
        // ...
        }
    }
     
    public class MyObjectA extends MyObject {
       private Z z=null;
       public MyObjectA(X x, Y y) {
          super(x,y);
       }
       public Z getZ() {
          return z;
       }
       public void setZ(Z z) {
          this.z=z;
       }
    }
    Que pensez-vous de cette approche ? Quelles serait ses limites ? Voyez-vous d'autres approches ?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Mbah il y a des manières plus ou moins flexibles de s'en sortir, celle-ci est vraiment très flexible.

    Comme limite, il pourrait y avoir le fait que le projet A va devoir caster ce que lui donne le MyRepository pour accéder à la propriété supplémentaire z.
    Ce n'est pas vraiment un problème en fait, mais on peut faire mieux.
    Par exemple avec des génériques :

    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
    @FunctionalInterface
    public interface ObjectCreator<A extends MyObject> {
        public A create(X x, Y y);
    }
     
    public class MyRepository<A extends MyObject> {
      private final ObjectCreator<A> objectCreator;
      public MyRepository(ObjectCreator<A> objectCreator) {
        Objects.requireNonNull(objectCreator);
        this.objectCreator = objectCreator;
      }
     
        // reste du code existant
        // ...
     
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    lvr
    lvr est déconnecté
    Membre extrêmement actif Avatar de lvr
    Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2006
    Messages
    909
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2006
    Messages : 909
    Points : 1 360
    Points
    1 360
    Par défaut
    Je vais essayer ça . Merci.

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

Discussions similaires

  1. [@MVC] Spring injection de propriété
    Par algabow dans le forum Spring Web
    Réponses: 1
    Dernier message: 09/12/2011, 00h16
  2. [Framework] Impossible d'injecter une propriété "double" ou "float"
    Par flamant dans le forum Spring
    Réponses: 3
    Dernier message: 30/08/2010, 10h11
  3. [Framework] Injection de propriété d'un autre bean
    Par kpouer dans le forum Spring
    Réponses: 9
    Dernier message: 18/05/2010, 15h14
  4. [Framework] Injection automatique de propriétés depuis un fichier .properties
    Par julian_ross dans le forum Spring
    Réponses: 2
    Dernier message: 14/01/2009, 10h53

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