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 ?