Bonjour à tous,
Venant de C++ je commence le Java et j'ai d'ores et déjà quelques interrogations sur le fonctionnement interne du langage.
En C++, les fonctions sont par défaut non virtuelles, "normales". Il y a moyen de les rendre virtuelles par programmation, ainsi le method lookup se fera à l'exécution. Cela permet le polymorphisme mais cela force le processeur à devoir vérifier à chaque réception de message le type réel de l'objet qui reçoit ce message et de voir s'il n'y a pas une autre méthode de même nom. Bien.
Bien sûr en pratique OO, on a besoin du polymorphisme, et on comprend donc bien qu'en Java les méthodes soient virtuelles par défaut. Mais le problème est que si on veut déclarer une méthode dans une classe qui a des sous-classes mais qu'on sait très bien que cette méthode n'est pas overridée, ce serait bête de devoir faire cette vérification inutile et coûteuse en ressource.
Evidemment vous me direz on peut mettre la méthode en final pour l'empêcher d'être overridée. Mais je n'ai pas forcément envie de l'empêcher, j'aimerais simplement ne pas m'en soucier. Mieux, j'aimerais en fait pouvoir écrire ma fonction sans me soucier de si elle va être overridée ou pas, et j'aimerais qu'elle soit virtuelle dans le cas où elle est overridée, et non virtuelle dans le cas inverse. Les compilateurs devraient faire cela, non ?
Vous me direz que ce que je décris est exactement le method lookup fait à la compilation. En fait non. Le compilateur peut très bien après avoir assemblé toutes les classes, examiner les relations d'héritage et générer des appels normaux pour les méthodes dont il repère qu'elles sont uniques, et des appels avec du code de method lookup pour celles dont il voit qu'elles sont overridées.
Alors je me dis, est-ce que c'est cela que fait le compilateur Java, ou pas ?
C'est pointu mais je me pose vraiment la question, donc merci si vous en savez quelque chose ou si vous voulez ouvrir le débat des méthodes virtuelles...![]()





Répondre avec citation
Partager