Maison  >  Article  >  Java  >  Quelles sont les méthodes d'extension de fonctionnalités manquantes de Java

Quelles sont les méthodes d'extension de fonctionnalités manquantes de Java

WBOY
WBOYavant
2023-05-20 16:58:431471parcourir

    Que sont les méthodes d'extension

    Une méthode d'extension est la possibilité d'"ajouter" des méthodes directement à un type existant sans avoir à créer un nouveau type dérivé, à recompiler ou à modifier d'une autre manière le type existant. Lors de l’appel d’une méthode d’extension, il n’y a aucune différence perceptible par rapport à l’appel de la méthode réellement définie dans le type.

    Pourquoi les méthodes d'extension sont nécessaires

    Envisagez d'implémenter la fonction suivante : après avoir retiré de Redis une chaîne contenant plusieurs ID de produit (chaque ID de produit est séparé par une virgule), déduisez d'abord l'ID de produit (et soyez capable de conserver les éléments commande), et enfin utilisez des virgules pour relier chaque ID de produit.

    Méthode d'écriture traditionnelle :

    Utiliser la méthode Stream Writing :

    Supposons que les méthodes d'extension puissent être implémentées en Java, et que nous ajoutions la méthode d'extension toList pour le tableau (transformons le tableau en List), et ajoutons la méthode d'extension toSet pour List (transformer List en For LinkedHashSet), la méthode d'extension join a été ajoutée à Collection (pour connecter les formes de chaîne des éléments de la collection à l'aide du connecteur donné), nous pourrons alors écrire du code comme celui-ci :

    Je crois vous savez déjà pourquoi vous avez besoin de méthodes d'extension à ce stade Réponse :

    Vous pouvez directement améliorer la bibliothèque de classes existante au lieu d'utiliser des classes d'outils

    Par rapport à l'utilisation de classes d'outils, il est plus fluide et plus confortable d'écrire du code en utilisant la méthode du tapez lui-même

    Le code est plus facile à lire car il s'agit d'appels en chaîne au lieu d'utiliser des poupées imbriquées de méthodes statiques

    Comment implémenter des méthodes d'extension en Java

    Demandons d'abord au ChatGPT récemment populaire :

    Quelles sont les méthodes dextension de fonctionnalités manquantes de Java

    Le point de vue de ChatGPT est que en Java, les méthodes d'extension sont transmises. Implémentées par la méthode statique de la classe d'outils fournie. Je vais donc ensuite présenter une toute nouvelle technologie noire :

    Manifold

    Conditions de préparation

    Manifold et Lombok fonctionnent de la même manière, les deux sont traités au moment de la compilation via le processeur d'annotation. Afin d'utiliser Manifold efficacement, vous devez installer le plug-in Manifold IDEA dans IDEA

    puis ajouter annotationProcessorPaths au maven-compiler-plugin du projet pom :

    Si Lombok est utilisé dans votre projet, vous devez ajoutez Lombok à annotationProcessorPaths :

    Méthodes d'extension d'écriture

    Dans le JDK, la méthode split de String utilise une chaîne comme paramètre, c'est-à-dire String[] split(String). Ajoutons maintenant une méthode d'extension String[] split(char) à String : Split par caractères donnés.

    Écrire des méthodes d'extension basées sur Manifold :

    Vous pouvez trouver des méthodes statiques qui sont essentiellement des classes d'outils, mais il y a certaines exigences :

    Les classes d'outils doivent utiliser l'annotation @Extension de Manifold

    Dans les méthodes statiques, les paramètres du type cible sont requis Utilisez l'annotation @This

    Le nom du package où se trouve la classe d'outils doit se terminer par des extensions. Nom de classe complet du type cible

    —— Les étudiants qui ont utilisé C# souriront probablement en connaissance de cause. méthode d'extension.

    Concernant le point 3, la raison de cette exigence est que Manifold espère trouver rapidement des méthodes d'extension dans le projet, éviter l'analyse des annotations de toutes les classes du projet et améliorer l'efficacité du traitement.

    Avec la possibilité d'étendre les méthodes, nous pouvons désormais l'appeler ainsi :

    Incroyable ! Et vous pouvez constater que System.out.println(numStrs.toString()) imprime en fait la forme de chaîne de l'objet tableau - pas l'adresse de l'objet tableau. Parcourez l'App.class décompilé et observez que l'appel de méthode d'extension a été remplacé par un appel de méthode statique

    Quelles sont les méthodes dextension de fonctionnalités manquantes de Java

    et que la méthode toString du tableau utilise la méthode d'extension définie par Manifold pour le tableau ManArrayExt.toString (@This Object array):

    Quelles sont les méthodes dextension de fonctionnalités manquantes de Java

    [Ljava.lang.String;@511d50c0 Quelque chose comme ça, Au revoir, je ne te reverrai plus jamais~

    Parce que l'appel de méthode d'extension est remplacé par un appel de méthode statique au moment de la compilation, la méthode d'extension de Manifold est used , même si l'objet appelant la méthode est nul, il n'y a pas de problème, car le code traité passe null en paramètre à la méthode statique correspondante. Par exemple, pour étendre Collection :

    Puis lors de l'appel :

    java.lang.NullPointerException, Au revoir, je ne te reverrai plus jamais~

    Méthode d'extension de tableau

    Quelles sont les méthodes dextension de fonctionnalités manquantes de Java

    Nous voyons List écrit comme ceci : @Self est utilisé pour indiquer quel type doit être la valeur annotée. S'il s'agit de @Self, c'est-à-dire @Self(false), cela signifie la valeur annotée. et La valeur de l'annotation @This est du même type ; @Self(true) indique le type des éléments du tableau.

    Pour les tableaux d'objets, on peut voir que la méthode toList renvoie la Liste correspondante (T est le type de l'élément du tableau) :

    Quelles sont les méthodes dextension de fonctionnalités manquantes de Java

    Mais s'il s'agit d'un tableau de type primitif, la valeur de retour indiquée par IDEA est :

    Quelles sont les méthodes dextension de fonctionnalités manquantes de Java

    Mais j'utilise Java. Comment les génériques d'effacement peuvent-ils avoir une fonction aussi intéressante que List ? Vous ne pouvez donc utiliser que des types natifs pour recevoir cette valeur de retour :)

    Quelles sont les méthodes dextension de fonctionnalités manquantes de Java

    — sera bientôt libéré.

    Nous voyons souvent dans divers projets que tout le monde conditionne d'abord un objet en facultatif, puis effectue un filtre, une carte, etc. Grâce au mappage de types de @Self, vous pouvez ajouter une méthode très pratique à Object comme celle-ci :

    Ensuite, tout objet aura la méthode asOpt().

    Par rapport à l'emballage non naturel qui devait être fait auparavant :

    Vous pouvez désormais utiliser Facultatif naturellement :

    Bien sûr, Object est la classe parent de toutes les classes. Que cela soit approprié ou non, vous devez toujours y réfléchir attentivement. .

    Méthodes statiques étendues

    Nous savons tous que Java9 ajoute des méthodes d'usine aux collections :

    N'est-ce pas tentant ? Parce que si vous n'utilisez pas Java 9 et supérieur (Java 8 : montrez-moi simplement votre carte d'identité), vous devez utiliser une bibliothèque comme Guava. Cependant, ImmutableList.of n'est pas aussi bon que List.of utilisé. .

    Cela n’a pas d’importance, a déclaré Manifold : « Cela n’a pas d’importance, je vais agir. » Étendre les méthodes statiques basées sur Manifold consiste à ajouter @Extension à la méthode statique de la classe étendue :

    Ensuite, vous pouvez vous tromper en utilisant une version après Java8 - vous pouvez faire ce que vous voulez, j'utilise Java8 .

    BTW, parce qu'Object est la classe parent de toutes les classes, si vous ajoutez une méthode d'extension statique à Object, cela signifie que vous pouvez accéder directement à cette méthode statique n'importe où sans avoir besoin d'importer - Félicitations, vous êtes débloqué "Top fonctions" .

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer