Bonjour,

J'ai récemment eu l'occasion d'utiliser l'injection de dépendance, je trouve cela pratique et ça permet d'écrire un code propre avec séparation des couches.

Mais un détail m'a chiffonné. Il peut arriver des cas de figure où on a besoin d'effectuer des opérations dans le constructeur. Or, dans l'état actuel de l'api standard, il n'est pas possible d'injecter les dépendances avant l'appel du constructeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
public class Exemple {
    @Inject
    private Dependance dependance;
 
    public Exemple() {
        // Ici la dépendance n'est pas encore injectée
    }
}
Pour contourner cette limitation, il est possible d'annoter un constructeur avec @Inject, et ce sont les paramètres du constructeur qui sont injectés :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
public class Exemple {
    private Dependance dependance;
 
    @Inject
    public Exemple(Dependance dependance) {
        this.dependance = dependance;
        // Ici la dépendance est injectée
    }
}
C'est peut-être une question de goût, mais je trouve que cette pirouette n'est pas très élégante. En plus, j'ai déjà eu l'occasion de tomber sur des cas de figures où une classe possède de nombreuses dépendances, et on se retrouve avec un constructeur avec quatre ou cinq arguments, ça commence à faire beaucoup.

L'idée que je souhaite soumettre à discussion est celle-ci :
Serait-il possible que la classe java.lang.Class soit modifiée (dans le cadre d'une JSR) pour fournir un meta-objet, c'est-à-dire un objet non encore initialisé ?
Ce que je souhaiterais, c'est que les frameworks d'injection de dépendance puissent utiliser l'api standard pour injecter les dépendances avant l'appel du constructeur. Par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
MetaObject<Exemple> meta = java.lang.Class.getMetaObject(Exemple.class);
meta.set("dependance", new Dependance()); // Injecte la dépendance
Exemple object = meta.init(); // Appel le constructeur
Je ne connais pas bien le mécanisme de construction des objets. Je sais seulement qu'il se déroule en plusieurs étapes, et que, en théorie, rien n'empêche de décomposer ces étapes. Je voudrais votre avis là-dessus. Pour ceux qui sont motivés, peut-être pourrions-nous même collaborer pour soumettre une requête au JCP. Je ne connais pas bien non plus les procédures du JCP ni comment il est possible d'y participer. Je suis ouvert à toutes les bonnes volontés.