Eine Erweiterungsmethode ist die Möglichkeit, Methoden direkt zu einem vorhandenen Typ hinzuzufügen, ohne einen neuen abgeleiteten Typ erstellen, neu kompilieren oder den vorhandenen Typ anderweitig ändern zu müssen. Beim Aufruf einer Erweiterungsmethode gibt es keinen offensichtlichen Unterschied zum Aufruf der tatsächlich im Typ definierten Methode.
Warum Erweiterungsmethoden benötigt werden
Erwägen Sie die Implementierung der folgenden Funktion: Nachdem Sie eine Zeichenfolge mit mehreren Produkt-IDs aus Redis entnommen haben (jede Produkt-ID ist durch ein Komma getrennt), deduplizieren Sie zunächst die Produkt-ID (und können die Elemente verwalten). Reihenfolge) und verwenden Sie abschließend Kommas, um die Produkt-IDs zu verbinden.
Angenommen, Erweiterungsmethoden können in Java implementiert werden, und wir fügen die Erweiterungsmethode toList für das Array hinzu (verwandeln Sie das Array in List) und fügen die Erweiterungsmethode toSet für hinzu List (verwandeln Sie List in For LinkedHashSet), wurde der Collection die Erweiterungsmethode join hinzugefügt (um die String-Formen von Elementen in der Collection mithilfe des angegebenen Connectors zu verbinden), dann können wir Code wie diesen schreiben:
Ich glaube An dieser Stelle wissen Sie bereits, warum Sie Erweiterungsmethoden benötigen. Antwort:
Sie können die vorhandene Klassenbibliothek direkt erweitern, anstatt Werkzeugklassen zu verwenden.
Im Vergleich zur Verwendung von Werkzeugklassen ist es reibungsloser und komfortabler, Code mit der Methode zu schreiben Geben Sie sich selbst ein
Der Code ist einfacher zu lesen, da es sich um Kettenaufrufe handelt, anstatt statische Methoden-Nesting-Puppen zu verwenden.
Fragen wir zunächst das kürzlich beliebte ChatGPT:
Die Ansicht von ChatGPT ist dies In Java werden Erweiterungsmethoden durch die statische Methode der bereitgestellten Toolklasse implementiert. Als nächstes werde ich eine brandneue schwarze Technologie vorstellen:
Manifold
Manifold und Lombok funktionieren ähnlich, beide werden zur Kompilierungszeit durch den Annotation-Prozessor verarbeitet. Um Manifold effektiv nutzen zu können, müssen Sie das Manifold IDEA-Plugin in IDEA installieren
und dann annotationProcessorPaths zum Maven-Compiler-Plugin des Projekts pom hinzufügen:
Wenn Lombok in Ihrem Projekt verwendet wird, müssen Sie dies tun Lombok zur Annotation hinzufügenProcessorPaths:
Im JDK verwendet die Split-Methode von String eine Zeichenfolge als Parameter, nämlich String[] split(String). Fügen wir nun eine Erweiterungsmethode String[] split(char) zu String: Split by gegebene Zeichen hinzu.
Schreiben Sie Erweiterungsmethoden basierend auf Manifold:
Sie können statische Methoden finden, die im Wesentlichen Werkzeugklassen sind, aber es gibt einige Anforderungen:
Werkzeugklassen müssen die @Extension-Annotation von Manifold verwenden
In statischen Methoden Parameter des Zieltyps sind erforderlich. Verwenden Sie die Annotation „@This“. Der Paketname, in dem sich die Tool-Klasse befindet, muss mit Erweiterungen enden. Der vollständig qualifizierte Klassenname des Zieltyps ist erforderlich. Schüler, die C# verwendet haben, werden wahrscheinlich wissentlich lächeln. Erweiterungsmethode.
In Bezug auf Punkt 3 besteht der Grund für diese Anforderung darin, dass Manifold hofft, schnell Erweiterungsmethoden im Projekt zu finden, das Scannen aller Klassen im Projekt durch Annotationen zu vermeiden und die Verarbeitungseffizienz zu verbessern.
Mit der Möglichkeit, Methoden zu erweitern, können wir es jetzt so nennen:
Erstaunlich! Und Sie können feststellen, dass System.out.println(numStrs.toString()) tatsächlich die Zeichenfolgenform des Array-Objekts ausgibt – nicht die Adresse des Array-Objekts. Durchsuchen Sie die dekompilierte App.class und stellen Sie fest, dass der Erweiterungsmethodenaufruf durch einen statischen Methodenaufruf
ersetzt wurde und die toString-Methode des Arrays die von Manifold für das Array ManArrayExt.toString(@This Object) definierte Erweiterungsmethode verwendet array): [Ljava.lang.String;@511d50c0 So etwas in der Art, Auf Wiedersehen, wir sehen uns nie wieder~Da der Erweiterungsmethodenaufruf zur Kompilierungszeit durch einen statischen Methodenaufruf ersetzt wird, ist die Erweiterungsmethode von Manifold Selbst wenn das Objekt, das die Methode aufruft, null ist, gibt es kein Problem, da der verarbeitete Code null als Parameter an die entsprechende statische Methode übergibt. Zum Beispiel, um die Sammlung zu erweitern:
Dann beim Aufruf:
java.lang.NullPointerException, Goodbye, never see you again~
Array-Erweiterungsmethode
Wir sehen, dass List so geschrieben ist: @Self wird verwendet, um anzugeben, welchen Typ der annotierte Wert haben soll. Wenn es sich um @Self handelt, also @Self(false), bedeutet dies den annotierten Wert und Der Wert der @This-Annotation ist vom gleichen Typ; @Self(true) gibt den Typ der Elemente im Array an.
Für Objektarrays können wir sehen, dass die toList-Methode die entsprechende Liste zurückgibt (T ist der Typ des Array-Elements):
Wenn es sich jedoch um ein Array vom primitiven Typ handelt, lautet der von IDEA angegebene Rückgabewert:
Aber ich verwende Java, um eine so tolle Funktion wie List zu haben. Man kann also nur native Typen verwenden, um diesen Rückgabewert zu erhalten bald veröffentlicht werden.
In verschiedenen Projekten sehen wir oft, dass jeder zuerst ein Objekt in Optional verpackt und dann einen Filter, eine Zuordnung usw. durchführt. Durch die Typzuordnung von @Self können Sie Object wie folgt eine sehr praktische Methode hinzufügen:
Dann verfügt jedes Objekt über die Methode asOpt(). Verglichen mit der unnatürlichen Verpackung, die zuvor durchgeführt werden musste: Sie können jetzt optional natürlich verwenden: Natürlich ist Object die übergeordnete Klasse aller Klassen, Sie müssen immer noch sorgfältig überlegen . Erweiterte statische MethodenWir alle wissen, dass Java9 Factory-Methoden zu Sammlungen hinzufügt: Ist das nicht verlockend? Denn wenn Sie Java 9 und höher nicht verwenden (Java 8: Zeigen Sie mir einfach Ihren Ausweis), müssen Sie eine Bibliothek wie Guava verwenden. Allerdings ist ImmutableList.of nicht so gut wie List.of . Es spielt keine Rolle, sagte Manifold: „Es spielt keine Rolle, ich werde Maßnahmen ergreifen.“ Das Erweitern statischer Methoden basierend auf Manifold besteht darin, @Extension zur statischen Methode der Erweiterungsklasse hinzuzufügen: Dann können Sie sich dazu verleiten, eine Version nach Java8 zu verwenden – Sie können tun und lassen, was Sie wollen, ich verwende Java8. Übrigens, da Object die übergeordnete Klasse aller Klassen ist, bedeutet das Hinzufügen einer statischen Erweiterungsmethode zu Object, dass Sie überall direkt auf diese statische Methode zugreifen können, ohne importieren zu müssen – Herzlichen Glückwunsch, Sie haben die „Top-Funktionen“ freigeschaltet. .Das obige ist der detaillierte Inhalt vonWas sind die fehlenden Funktionserweiterungsmethoden von Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!