Les méthodes d’extension de Lombok

Cet article est une immersion profonde dans l’annotation @ExtensionMethod de Lombok. Il s’attardera sur son utilité, ses cas d’utilisation, ses astuces, ses conseils et ses inconvénients.

Une méthode d’extension est une caractéristique des langages de programmation orientés objet qui permet aux méthodes définies en dehors d’une classe d’être utilisées avec des objets de cette classe (en utilisant l’opérateur ‘.’) Comme s’elles faisaient partie de la classe. De nombreux langages de programmation tels que C#, Scala, Kotlin et TypeScript ont cette fonctionnalité.

Java ne le fait pas nativement.

L’annotation @ExtensionMethod de Lombok ajoute cette fonctionnalité à Java.

Les limitations du langage

En Java, les méthodes appelables à partir d’un objet sont celles définies dans la classe de cet objet, les superclasses et les interfaces (méthodes par défaut). C’est en fait le but de la programmation orientée objet – pour que le code d’exécution reste proche des données sur lesquelles ils opèrent.

Cependant, il est évident que cela n’est pas suffisant ou pratique dans beaucoup de cas. Il est toujours vrai que nous devrions rapprocher les exécutions (méthodes) des données, mais il n’est pas toujours pratique d’inclure toutes les exécutions possibles dans la définition de classe.

D’une part, cela peut être assez. D’un autre côté, qui peut les anticiper toutes? Pensez à une classe comme String. Il y a une liste presque infinie de choses applicables à String. Non seulement cela, pour garder l’intégrité des données internes et assurer des comportements prévisibles à cette classe fondamentale, String est une classe finale en Java. Donc, peu importe combien vous voudrez, l’étendre pour y ajouter des fonctionnalités, vous n’y arriverez pas. Jusqu’à ce que Java intégré cette possiblité, @ExtensionMethod de Lombok vient à la rescousse.

@ExtensionMethod de Lombok

Avec @ExtensionMethod, vous pouvez ajouter des méthodes à des classes existantes – ou du moins, vous aurez cet impression – comme si elles avaient été écrites directement à l’intérieur des classes.

Cela peut être utilisé pour améliorer la lecture du code – ou mieux l’aligner avec les méthodes intégrées. Le nom de la méthode se trouve à l’arrière de l’objet plutôt qu’à l’avant, donc il s’aligne avec les appels à proximité. Regardons l’exemple de code ci-dessous:

Notez que sur la ligne 14 et la ligne 15, j’appelle la méthode isAllCap sur une String. Mais isAllCap n’est pas une méthode intégrée à la classe String. A la place, isAllCap est une méthode d’extension déclarée sur la ligne #6. En déclarant cela, la classe Main utilisera des méthodes d’extension de la classe Extensions. Lombok traduit tout appel de méthode avec la signature appropriée comme si elle faisait partie de cette classe.

Utiliser @ExtensionMethod

Pour utiliser @ExtensionMethod, procédez comme suit:

  • Dans une classe, définissez la méthode (ne doit pas nécessairement être dans une classe séparée)
  • Rendre la méthode statique
  • Le premier paramètre de la méthode doit être le type que cette méthode va étendre
  • Ajoutez l’annotation @ExtensionMethod ({Extensions.class}) (remplacez ‘Extensions’ par le nom de la classe dans la première étape) à la classe appelante pour indiquer à Lombok où rechercher les méthodes d’extension. Plusieurs classes d’extension peuvent être mises là.
  • Maintenant, la méthode est disponible

Remarque: Eclipse n’est pas assez intelligent pour offrir l’auto-complétion à ces méthodes, mais il détecte que les méthodes sont statiques, il apparaît donc en italique.

Quand utiliser?

Voici quelques-uns des endroits où et quand j’ai trouvé des méthodes d’extension utiles.

Extension de classes existantes

Si vous n’avez pas écrit une classe et que vous avez besoin de faire quelque chose d’autre que le but de son auteur, ajoutez-les (fonctionnalités) lui en tant que méthodes d’extension. J’ai eu besoin de nouvelles méthodes pour les classes telles que String, BigDecimal, ResultSet, et JsonElement (Gson) pour n’en nommer que quelques-uns. Par exemple, dans une application, j’ai besoin eu besoin de convertir de String en date et String à BigDecimal partout. La conversion est toujours la même (même si elle est modifiée, elle changera de la même manière).

Maintenant, je peux faire …

 

Apprivoiser l’influence des nouvelles API

Une fois, j’ai eu une conversation avec un développeur senior qui avait du mal avec l’API Stream. Au bout d’un moment, j’ai senti que le nom de ces méthodes était: «Qu’est-ce que« map »signifie« Mapper quoi avec quoi? »,« Pouvez-vous expliquer «réduire / collecter»? Une autre partie est un sentiment écrasant lors de la lecture des appels de méthodes chainées – faite par des Juniors, bien sûr. Avec un certain refactoring, ce type de pipeline peut être beaucoup plus lisible.

Ce qui précède peut être fortement refactorisé. Chacune de ces fonctions contient une quantité considérable de traitement.

  • toText, par exemple, ouvre le fichier, en lit une chaîne et gère les exceptions de manière appropriée.
  • toGson convertit le contenu textuel du fichier en supprimant les métadonnées et renvoie les informations de commande réelles.
  • originatedIn2017 obtient la date de la commande, analyse la date et vérifie l’année, et ainsi de suite.

Pour refactoriser davantage, avec des features natives en java, vos options sont de placer les premiers appels dans une méthode, en combinant des fonctions (avec compose et andThen), et en combinant des prédicats (avec or et and).

Les deux moyens ont des avantages, des inconvénients et des limites et produisent des résultats différents qui se lisent différemment. Avec @ExtensionMethod, vous avez un autre outil dans votre boîte. Vous pouvez combiner arbitrairement des appels dans la chaîne. Vous pouvez utiliser vos propres terminologies qui ont un sens pour votre domaine d’activité (voir le langage omniprésent en DDD) au lieu de simplement mapper, filtrer, collecter, etc. Le code suivant peut être changé en un code de style DSL ….

Cela ne veut pas dire quel style est le meilleur. Je veux juste souligner que vous avez plus d’options pour adapter votre code à vos besoins.

Apprivoiser le Null

Comme vous pouvez le constater d’après les exemples ci-dessus, les méthodes d’extension peuvent être développer en toute sécurité concernant des références nulles. Ceci peut être extrêmement utile. L’ensemble des opérations peut utiliser des méthodes d’extension pour gérer le cas des références nulles, par exemple des méthodes de conversion comme celles ci-dessus ou des méthodes de contrôle telles que isBlank, isEmpty, isZero et isValid. Voici quelques exemples de méthodes spécifiques qui ne provoquent pas de NullPointerException qui peuvent être utiles.

Limitations

C’est une annotation.Rien de plus. @ExtensionMethod de Lombok n’est pas un citoyen de première classe. Voici quelques limitations notables.

Lambda

Parce qu’une expression lambda est un autre truc du compilateur, l’information sur le type d’une expression lambda n’est pas accessible à Lombok. Donc elle ne peuvent pas être utilisées comme paramètre pour les méthodes d’extension. Si vous voulez vraiment utiliser lambda avec @ExtemsionMethod, vous devrez lui donner un type – quelque chose comme ceci.

Ce qui est laid comme l’enfer, alors évitez-le.

Auto-complétion

Eclipse et IDEA, au moment de la rédaction de ce document, ne proposent pas d’auto-complétion pour les méthodes d’extension. Vous devrez savoir ce que vous allez utiliser. C’est l’un des plus grands facteurs limitants pour moi lors de l’utilisation de cette API. Ce n’est pas si mal que ça. Eclipse reconnaît les appels de méthode en tant qu’appels de méthodes statiques. Il formate donc correctement le nom de la méthode (en italique). Cela fournit un indice visuel lors de la lecture du code.

Discussion

Est-ce que ça casse OO? Non! Pas même le moins du monde. Les méthodes d’extension sont essentiellement une autre façon d’appeler des méthodes statiques. La méthode n’a aucun privilège supplémentaire sur les champs/méthodes privés ou protégés de l’objet. @ExtemsionMethod est un excellent outil à avoir dans votre boîte à outils. Comme toutes les autres caractéristiques, il devrait être utilisé avec considération. Est-ce que votre équipe le connaît? Utilisez-vous un IDE qui supporte cela? Utilisez-le lorsque vous voyez des avantages.

Conclusion

@ExtemsionMethod de Lombok est un excellent outil à avoir dans la boîte à outils. Il permet d’appeler des méthodes statiques comme si elles étaient des méthodes d’instance. Il donne plus d’options pour ajouter des fonctionnalités à des classes existantes, manipuler null etc. En plus de cela, il vous le donne de manière naturelle.

                                                                                                                                                                TOUNGA Franck

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.