B2 · Episode 2 · 5:01

Anonymous Classes and Functional Interfaces in Java

This episode explains how Java uses anonymous classes and functional interfaces to emulate JavaScript-style event handling, since Java functions cannot be passed as objects directly.

Source:Nicolas Hurtubise / classe.iro.umontreal.ca · License:CC BY-SA 4.0

Transcript

  1. à la fonction qui charge de regarder quoi faire quand il y a un événement.

    a function that handles what to do when an event occurs.

  2. On pourrait définir ce genre de choses- là pour toutes sortes d'événements.

    We could define such things for all kinds of events.

  3. Mettons qu'on est intéressé à afficher bonjour dans la console quand

    Suppose we want to display 'Hello' in the console when

  4. quelqu'un presse sur la touche espace en particulier, on

    someone presses the spacebar specifically—we

  5. pourra enregistrer un événement lors du key up,

    can register a key-up event,

  6. puis à ce moment- là, le code exécuté dans le cas où cet événement- là survient,

    and at that moment, the code executed when this event occurs is the following:

  7. c'est le code suivant, c'est appeler la fonction qui va regarder si le code de

    call a function that checks

  8. l'événement c'est bien la touche espace qui a été appuyée.

    whether the event’s key code is indeed the spacebar.

  9. Si c'est le cas, ben on affiche bonjour.

    If so, then display 'Hello'.

  10. Fait que ok, ça c'est ce qu'on peut faire en JavaScript.

    Okay, this is what we can do in JavaScript.

  11. Maintenant en Java, en

    Now, in Java—

  12. Java c'est malheureusement pas comme ça que ça fonctionne.

    unfortunately, it doesn’t work this way.

  13. En Java, les fonctions ne sont pas des objets.

    In Java, functions are not objects.

  14. À peu près tout en Java est un objet, mais

    Almost everything in Java is an object, but

  15. les fonctions font pas partie de ça.

    functions are not part of that.

  16. Les fonctions sont des procédures stockées dans l'ordinateur d'une façon ou d'une

    Functions are procedures stored in the computer in some way or another,

  17. autre, mais Java ne modélise pas les fonctions comme quelque chose qu'on peut mettre

    but Java does not model functions as things that can be placed

  18. dans une variable, passer en paramètre à d'autres choses,

    into variables, passed as parameters to other methods,

  19. retourner comme valeur. Vraiment les fonctions c'est quelque chose de spécial en

    or returned as values. Indeed, functions are something special in Java,

  20. Java qui peut pas être utilisé

    and cannot be used

  21. pour passer n'importe où n'importe quand.

    to pass around freely anywhere, anytime.

  22. Maintenant qu'on essayait d'exécuter ce code- là ici,

    Now, if we tried to run this code here—

  23. mettons qu'on avait la fonction direBonjour qui est définie similairement à l'autre

    suppose we’ve defined a sayHello function similar to the earlier one,

  24. de tantôt, direByeBye qui est définie similairement à l'autre de tantôt,

    and a sayByeBye function also defined similarly,

  25. on pourrait pas faire quelque chose dans ce style- là.

    we couldn’t write code like this.

  26. On peut pas assigner directement la

    We can't directly assign

  27. fonction qui a contenu dans direBonjour à une variable.

    the function contained in 'direBonjour' to a variable.

  28. C'est pas quelque chose qui marche en Java,

    This doesn't work in Java,

  29. c'est pas quelque chose qui fonctionne avec le modèle de Java.

    nor does it fit Java's programming model.

  30. Fait que pour faire la programmation événementielle,

    So, to implement event-driven programming,

  31. ce modèle- là ici est très pratique.

    this model here is very practical.

  32. Dans le fond, ce modèle- là est très flexible,

    In essence, this model is highly flexible:

  33. on a juste à définir des événements,

    we simply define events,

  34. puis donner une valeur qui contient en fait la fonction qu'on veut exécuter selon

    and then assign a value for each event—

  35. l'événement qui s'est produit.

    that value is actually the function we want to run when that event occurs.

  36. Dans le cas de l'événement click, on veut exécuter cette fonction- là.

    For example, when the 'click' event occurs, we want to execute this function.

  37. Dans le cas de l'événement keyup, on

    And when the 'keyup' event occurs,

  38. veut exécuter cette fonction- là.

    we want to execute this other function.

  39. Bien, pour faire de la programmation événementielle en Java,

    Now, to do event-driven programming in Java—

  40. comme ce qu'on va faire avec les interfaces graphiques,

    for instance, when building graphical user interfaces—

  41. Il nous faut une façon de faire ça quand même.

    we still need a way to achieve this.

  42. Puis dans le fond, même si cette syntaxe- là directement est pas légale en Java,

    In fact, even though this exact syntax isn't legal in Java,

  43. même si ce truc- là directement est pas possible, on

    even though this direct approach isn't possible,

  44. peut se débrouiller d'une autre façon grâce aux autres mécanismes que Java nous

    we can still find another way using other mechanisms Java provides,

  45. propose, comme les interfaces puis l'héritage.

    such as interfaces and inheritance.

  46. Mettons qu'on se définit une interface qui permet de représenter une fonction.

    Suppose we define an interface to represent a function.

  47. puis qu'on se définit dans le fond que cette interface là a une seule méthode qui

    Then, suppose this interface has just one method,

  48. est execute avec les bons arguments en paramètres

    called 'execute', with the correct parameter types.

  49. ben on pourrait aller se faire deux classes carrément qui vont chacune implémenter

    Well then, we could create two classes outright,

  50. l'interface function Puis dans le fond,

    each implementing the 'Function' interface.

  51. ces deux classes- là vont posséder la méthode execute avec String args en paramètre.

    These two classes will both have the 'execute' method, accepting a 'String' parameter.

  52. Puis ces classes- là vont représenter

    Then, these classes will represent

  53. le même genre d'objet qui nous permet de

    the same kind of object that lets us

  54. contenir une fonction, de représenter une fonction.

    encapsulate a function—i.e., represent a function.

  55. Dans le fond, n'importe quelle instance de DireBonjour, quand on va

    In essence, any instance of DireBonjour, when we

  56. exécuter sa méthode execute avec un certain paramètre,

    call its execute method with a certain parameter,

  57. ben ça va exécuter ce code- là.

    will execute that code.

  58. N'importe quelle instance de DireByeBye va plutôt exécuter ce code- là.

    Any instance of DireByeBye, by contrast, will execute that other code.

  59. Puis les deux implémentent

    Moreover, both implement

  60. la même interface, donc c'est deux trucs qui sont compatibles.

    the same interface—so they’re compatible.

  61. On pourrait aller se faire de quoi de ce style- là.

    We could do something like this:

  62. on pourrait aller se définir une variable de type notre interface Function,

    define a variable of type Function (our interface),

  63. puis aller faire de quoi de similaire à mon exemple de tout à l'heure où on avait

    then do something similar to our earlier JavaScript example where we had

  64. une chance sur deux d'avoir une fonction,

    a 50% chance of getting this function,

  65. une chance sur deux d'avoir l'autre fonction.

    and a 50% chance of getting the other one.

  66. Dans le fond, plutôt que de mettre une fonction dans notre variable,

    Essentially, instead of storing a function directly in our variable,

  67. on met soit une instance de telle affaire,

    we store an instance of one kind of class,

  68. soit une instance de telle autre affaire,

    or an instance of another kind,

  69. puis à la fin on exécute la méthode qui représente dans le fond ce que cet objet- là

    and finally call the method representing what this object

  70. doit faire. Donc, ça marche, ça fait ce qu'on faisait avec la programmation

    is supposed to do.

  71. fonctionnelle en JavaScript tout à

    So it works—it achieves the same result as functional programming in JavaScript did earlier.

  72. l'heure. mais c'est quand même lourd

    Yet here, achieving the same thing feels unnecessarily heavy.

  73. ici dans le fond pour arriver à faire la même chose que ce qu'on faisait dans le

    Compared to that first JavaScript example,

  74. premier exemple en JavaScript dans le fond pour faire ce qu'on avait à

    we need far more steps to accomplish the same task.

  75. Cette page- là ici, ben ici

    On this page here,

  76. on a à peu près une dizaine de lignes de JavaScript, 10 ou 15,

    we have only about ten lines of JavaScript—maybe fifteen at most.

  77. alors qu'ici ben on a quatre fichiers, trois classes, une interface,

    Here, though? We need four files: three classes and one interface.

  78. là- dedans on a deux classes qui sont instanciées une seule fois dans tout le

    Inside them, two classes are instantiated only once throughout the entire program,

  79. programme, c'est lourd, c'est pas pratique.

    making this approach overly cumbersome and impractical.

  80. Fait que pour simplifier tout ça,

    So, to simplify all this,

  81. on peut profiter d'un concept en Java qui est le concept de classe anonyme.

    we can use a concept in Java called an anonymous class.

  82. Dans le fond, en Java, une classe anonyme,

    Essentially, in Java, an anonymous class

  83. c'est une classe qui va être instanciée tout de suite sur le coup.

    is a class that gets instantiated immediately.