|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
![]() ![]() Yann D'IsantoIngénieur développement logiciels Inscription : février 2005 Messages : 2 642 ![]() |
Bonjour,
Je viens d'écrire un petit article qui présente la classe EventHandler permettant de simplifier l'écriture de listeners. Bonne lecture. le y@m's
__________________
Je ne répondrai à aucune question technique par MP. Pensez aux Tutoriels et aux FAQs avant de poster Enfin, quand une solution a été trouvée à votre problème pensez au tag ![]() Cours Dvp : http://ydisanto.developpez.com Blog : http://yann-disanto.blogspot.com/ Page perso : http://yann-disanto.fr |
|
40
|
|
|
#2 |
![]() ![]() Marc Développeur Java Inscription : mai 2007 Messages : 1 564 ![]() |
Merci pour cet article le y@m's
__________________
Pas de questions technique par MP, les forums sont là pour ça. Le 5 et 6 juin à Toulouse, la première EclipseCon France ! |
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : septembre 2008 Messages : 1 099 ![]() |
Il y a là un avantage esthétique évident, mais j'avoue que je préfère personnellement éviter de telles surcouches juste pour cette raison.
En effet si le code est destiné a être maintenu par d'autre, j'ai personnellement eu la douleur d'avoir à gérer/comprendre de nombreuses surcouches "inutiles". |
|
|
00
|
|
|
#4 |
![]() ![]() Nicolas Ingénieur développement logiciels Inscription : juin 2009 Messages : 2 766 ![]() |
Comme il a été mentionné en introduction, la raison n'est pas que purement esthétique.
__________________
|
|
|
00
|
|
|
#5 | |
![]() ![]() Yann D'IsantoIngénieur développement logiciels Inscription : février 2005 Messages : 2 642 ![]() |
Citation:
J'ai moi aussi fait beaucoup de maintenance de code et la lisibilé, avec la documentation, est un critère primordial. En fait je dirais que le cas de la maintenance de code est le meilleur argument pour l'utilisation de l'EventHandler. Tu parles de la douleur de maintenir du code avec beaucoup de couches inutiles, ce que je comprends, mais là la "surcouche" est très faible. On est loin d'un gros framework nécessitant plusieurs heures d'apprentissage, c'est une simple classe standard de type factory appréhendable en 5 min grace à notre amie la javadoc. Le gain de lisibilité (déjà maintenu des classes de plusieurs milliers de lignes avec plusieurs dizaines de classes anonymes, c'est assez douloureux aussi ) est quand même très largement supérieur au "coût"
__________________
Je ne répondrai à aucune question technique par MP. Pensez aux Tutoriels et aux FAQs avant de poster Enfin, quand une solution a été trouvée à votre problème pensez au tag ![]() Cours Dvp : http://ydisanto.developpez.com Blog : http://yann-disanto.blogspot.com/ Page perso : http://yann-disanto.fr |
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé Sénior
![]() Inscription : avril 2002 Messages : 2 676 ![]() |
A noter qu'avec java 8 ça sera faisable bien plus proprement et efficacement grâce aux références de méthode.
Pour reprendre un exemple du tuto: Code :
Code :
button.addActionListener(helloworld::sayHello); |
||
|
|
20
|
|
|
#7 |
|
Membre Expert
![]() Inscription : mai 2006 Messages : 1 011 ![]() |
Merci pour l'article, ca peut etre interessant. Concernant la lisibilité, je pense qu'il suffit de regarder le code pour comprendre comment ca marche. Quoique en lisant l'article, le passage de parametres ne me parait pas tres intuitif. Ceci dit, ca rend le code plus concis, ce qui est bien.
En revanche, on parle d'empreinte mémoire mais on parle bien du jar généré, non ? Si oui, il faudrait voir l'efficacité à l'execution et l'impact sur la consommation de mémoire. C'est efficace à ce niveau la ? Ca commence a ressembler à du C++/Csharp. Bref, ce qui voulait etre évité lors de la création du langage, ca, non ? |
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() Inscription : avril 2002 Messages : 2 676 ![]() |
En effet, la Java a toujours souhaité éviter certaines fonctionnalités dangereuses du C++ comme les goto, l’héritage multiple, ... Mais il ne me semble pas que Java ait jamais explicitement refusé les références de méthode.
En tout cas par rapport aux classes anonymes et à l'introspection, ça devrait être carrément plus avantageux autant en terme de performances que de lisibilité. |
|
|
20
|
|
|
#9 | |
![]() ![]() Yann D'IsantoIngénieur développement logiciels Inscription : février 2005 Messages : 2 642 ![]() |
Citation:
En effet, en utilisant des classes anonymes, chaque classe donnera un fichier .class supplémentaire (du genre MaClasse$1.class, MaClasse$2.class, etc.). On aura donc autant de .class suplémentaires que de classes anonymes. Cela augmente donc la taille du jar. Ensuite toutes ces classes doivent être chargées par la jvm pour pouvoir ensuite être instanciées. Cela augmente donc l'empreinte mémoire. En utilisant l'EventHandler, les classes sont construitent dynamiquement via un proxy, il n'y a donc pas de fichier .class supplémentaire dans le jar. Ensuite une seule classe est créée (et donc chargée en mémoire) par type de listener ce qui diminue l'empreinte mémoire. Je n'ai fait aucune mesure pour quantifier le gain. Il est cependant clair qu'il est minime pour de petites applications mais que plus le nombre de listeners augmente, plus il sera significatif
__________________
Je ne répondrai à aucune question technique par MP. Pensez aux Tutoriels et aux FAQs avant de poster Enfin, quand une solution a été trouvée à votre problème pensez au tag ![]() Cours Dvp : http://ydisanto.developpez.com Blog : http://yann-disanto.blogspot.com/ Page perso : http://yann-disanto.fr |
|
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() Inscription : mai 2006 Messages : 1 011 ![]() |
Citation:
![]() Citation:
|
||
|
|
00
|
|
|
#11 | |||||||
![]() ![]() Yann D'IsantoIngénieur développement logiciels Inscription : février 2005 Messages : 2 642 ![]() |
Citation:
Soit le code suivant Code :
Citation:
Maintenant avec Code :
Citation:
C'est le nombre d'implémentation qui se limite à un par type de listener, pas le nombre d'instance de listener Or comme ces classes sont chargées par la jvm (instances de la classe Class<?>), on obtient donc bien une réduction de l'empreinte mémoire en réduisant ce nombre de classes.
__________________
Je ne répondrai à aucune question technique par MP. Pensez aux Tutoriels et aux FAQs avant de poster Enfin, quand une solution a été trouvée à votre problème pensez au tag ![]() Cours Dvp : http://ydisanto.developpez.com Blog : http://yann-disanto.blogspot.com/ Page perso : http://yann-disanto.fr |
|||||||
|
10
|
|
|
#12 |
|
Membre Expert
![]() Inscription : mai 2006 Messages : 1 011 ![]() |
Ok, j'avais pas pensé à ce gain. Ca doit pas etre enorme mais c'est toujours ca de pris. Si les performances ne sont pas impactées, ca peut servir en attendant java 8
|
|
|
00
|
|
|
#13 | ||
|
Expert Confirmé Sénior
![]() Inscription : avril 2002 Messages : 2 676 ![]() |
Citation:
. Java n'a rien contre intégrer des nouvelles fonctionnalités si elles ne posent pas de problème particulier. Dans le cas des Références de méthodes, les deux alternatives que sont les classes anonymes et l'introspection sont à la fois plus couteuses en ressources, carrément moins lisibles et source de complexité supplémentaire. Il n'y a pas vraiment de raison de s'y opposer. Citation:
A voir si le plus important est la consommation mémoire ou la vitesse de déclenchement des action. De toute façon dan les deux cas, il est fort probable que la différence ne se remarquera pas. |
||
|
|
00
|
|
|
#14 | |
|
Membre Expert
![]() Inscription : mai 2006 Messages : 1 011 ![]() |
Citation:
Ca impacte le moment ou on ajoute le listener, ca, c'est sur. Par contre, pour l'execution (qui est à mes yeux le plus important), c'est moins sur. A la lecture de l'article, je dirais que ca a un impact négatif vu comment sont utilisés les parametres. Mais comme précisé, ca doit pas non plus beaucoup jouer... |
|
|
|
00
|
|
|
#15 |
![]() ![]() |
Un petit problème avec ce EventHandler, c'est que du coup le compilateur ne vérifie pas si la méthode "foo" existe. L'erreur se verra à l'exécution, pas à la compilation.
Raison de plus d'y préférer les références de méthode, mais bon, face à l'horreur des classes anonymes, je crois que ce petit défaut sera facilement accepté. |
|
|
00
|
|
|
#16 | ||
|
Expert Confirmé Sénior
![]() Inscription : avril 2002 Messages : 2 676 ![]() |
Citation:
Citation:
D'après un petit test fait chez moi un method.invoke() est 30 fois plus lent qu'un appel classique |
||
|
|
00
|
|
|
#17 | ||
|
Membre Expert
![]() Inscription : mai 2006 Messages : 1 011 ![]() |
Citation:
Citation:
Je m'attendais à ce que la création de l'objet Method ne soit pas super rapide mais une fois créé, j'aurais pensé que l'invocation ne serait pas lente... En tout cas, merci pour l'info je garderais ca en tete au besoin... |
||
|
|
00
|
|
|
#18 | ||
![]() ![]() Yann D'IsantoIngénieur développement logiciels Inscription : février 2005 Messages : 2 642 ![]() |
Citation:
Pour un traitement de 100ms, l'invocation par classe anonyme est de 100ms et avec l'EventHandler 120ms. Pour un traitement de 200ms, l'invocation par classe anonyme est de 100ms et avec l'EventHandler 220ms. Donc le surcoût est relativement faible. Tu n'aurais pas fait une boucle par hasard ? (dans ce cas effectivement c'est normal que la différence soit si grande) Citation:
Une invocation de 10ms, avec un facteur de x30 devient 300ms. Cela peut rester acceptable pour un clic bouton. Tout dépendant de l'utilisation, il ne faut pas avoir peur d'allonger un peu un temps d'exécution si celui-ci reste acceptable (non perçu par l'utilisateur, en dessous de limites contractuelles, etc.).
__________________
Je ne répondrai à aucune question technique par MP. Pensez aux Tutoriels et aux FAQs avant de poster Enfin, quand une solution a été trouvée à votre problème pensez au tag ![]() Cours Dvp : http://ydisanto.developpez.com Blog : http://yann-disanto.blogspot.com/ Page perso : http://yann-disanto.fr |
||
|
00
|
|
|
#19 |
|
Expert Confirmé Sénior
![]() Inscription : avril 2002 Messages : 2 676 ![]() |
|
|
|
00
|
|
|
#20 | ||
![]() ![]() Yann D'IsantoIngénieur développement logiciels Inscription : février 2005 Messages : 2 642 ![]() |
Oui mais pourquoi tu crées un objet Method ?
Ce n'est pas ce que va faire l'EventHandler. L'EventHandler va se servir des string pour récupérer les méthodes sur les objets (target pour l'action et event pour la propriété). Fait le test en comparant vraiment ce dont il est question (l'appel à la méthode du listener) Voici par exemple le code de mon test : Code :
__________________
Je ne répondrai à aucune question technique par MP. Pensez aux Tutoriels et aux FAQs avant de poster Enfin, quand une solution a été trouvée à votre problème pensez au tag ![]() Cours Dvp : http://ydisanto.developpez.com Blog : http://yann-disanto.blogspot.com/ Page perso : http://yann-disanto.fr |
||
|
00
|
Copyright © 2000-2013 - www.developpez.com