Bonjour,
est ce qu il est possible d avoir une method comme parametre d un constructeur? par exemple. public myclass(4, 5, int add(int t){return t+4;})
Version imprimable
Bonjour,
est ce qu il est possible d avoir une method comme parametre d un constructeur? par exemple. public myclass(4, 5, int add(int t){return t+4;})
Oui, mais la syntaxe est différente.
Non testé.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public class MaClasse { public static void main(String[] args) { try { // int est une primitive, donc on utilise le TYPE de sa classe wrapper Method method = MaClasse.class.getMethod("add", new Class[] {Integer.TYPE}); MaClasse maClasse = new MaClasse(4, 5, method); } catch(NoSuchMethodException exception) { System.err.println("C'est tout planté! " + exception.getClass().getName() + " in MaClasse.main : " + exception.getMessage()); exception.printStackTrace(System.err); } } public MaClasse(int a, int b, Method method) { // Votre traitement } public int add(int t) { return t + 4; } }
C'est donc surement possible, mais quel est l'intérêt ?
C'est pour référencer un callback ou quelque chose comme ça ?
je voudrais savoir cette posibilité est dispo a partir de quel JDK?
Au moins depuis la 1.3
Code:
1
2
3 public MaClasse(int a, int b, Method method) throws Exception { Integer retour = (Integer) method.invoke(this, 5); }
Salut,
Pourquoi utiliser la reflection ?
Une interface mono-méthode peut parfaitement faire l'affaire :
Code:
1
2
3 public interface Callback { public int execute(int arg); }
a++Code:
1
2
3 public MaClasse(int a, int b, Callback callback) { int retour = callback.execute(5); }
je dois appeler le constructeur de la classe plusieurs foiset chaque fois avec une implementation differente de la method de l interface Callback.
par example.
public interface Callback {
public int execute(int a, int b);
public void execute ();
}
new maclass (Callback callback)
new maclass (Callback callback)
est ce qui il y a un moyen de preciser dans le constructeur la method a utiliser
Oui c'est exactement ça
Attention, dans ce speudo code il faut en réalité comprendre, pour être conforme à ta première phrase :
Du coup, l'objet MaClass n'a aucun choix à faire, vu qu'on lui donne lors de la construction la bonne implémentation de Callback.Code:
1
2
3
4
5 Callback cb1 = new MonCallbackDeType1(); Callback cb2 = new MonCallbackDeType2QuiFaitUneAddition(); MaClass m1 = new MaClass(cb1); MaClass m2 = new MaClass(cb2);
j ai besoin d une seule interface effectivement. Mais La method execute() dans cette interface peut prendre de parametres de types differents.
example: int execute (int, int); double execute(double);
j ai creer deux classes qui implementent chacune une des methods execute, mais j ai un erreur disant que je dois implementer toute les methods execute dans chaque classe,
y a t il un autre moyen de faire ceci?
Ca y est j'ai compris :idea:, j'ai mis le temps ....
En fait tu as besoin d'une Callback avec une méthode mais pouvant avoir plusieurs signatures. Donc ce n'est pas faisable avec une seule interface car il faudrait définir toutes les signatures possibles, et chaque implémentation de l'interface devrait tout implémenter, ce qui n'a pas de sens.
En revanche, tu peux y déclarer une méthode avec en paramètre un tableau d'objets pour être générique et pouvoir y faire passer ce que tu veux. C'est pas super très élégant car chaque classe doit connaître précisément les arguments attendus de la Callback à appeler ... C'est également le même combat si tu utilises la reflexion comme indiqué dans les premiers posts.
Du coup, peut être qu'il faut mieux créer autant d'interfaces de Callback différentes que tu as de signatures à gérer. Pour le nommage par contre c'est pas génial : CallbackAvecUnInt, CallbackAvecTroisString ....