Java Methode Klasse und Java 7 MethodHandle Klasse bezieht sich auf Objekte, die Methoden zugeordnet sind, aber immer noch auf sie werden selten verwendet. Wenn eine Funktion an eine andere übergeben werden soll, wird vorzugsweise eine anonyme Klasse verwendet, die eine Schnittstelle implementiert, die eine Methode enthält.
(Hinweis: MethodHandles sollen schneller sein als die alten Methoden.)
Warum werden diese Konstrukte nicht häufiger verwendet, um Funktionen an Funktionen zu übergeben? Liegt es daran, dass sie immer noch ausführlich sind?
Codebeispiel:
%Vor%AKTUALISIEREN
Nach einigen Benchmarks ist mir aufgefallen, dass MethodHandle schneller ist als die Methode von Reflection, aber immer noch nicht annähernd so schnell wie ein normaler Methodenaufruf. Vielleicht kann die JVM für den Methodenaufruf einige Optimierungen anwenden, die mit den Handles nicht möglich sind.
Abgesehen von irgendwelchen Leistungsargumenten, die Methods oder MethodHandles weitergeben:
Wie der Code zeigt, verringert die Verwendung von Methods oder MethodHandles nicht besonders die Menge an Code, die erforderlich ist, um ein Objekt zu deklarieren, das einer erstklassigen Funktion entspricht:
%Vor%Zugegeben, es ist nicht so schön wie eine echte Lambda-Syntax, aber die Typ-Sicherheit, Refactoring-Vorteile und die einfache Erklärung machen das Tippen dieser fünf Zeilen zur meist schlechten Option.
Methode Klasse hat ihren Platz, wenn es nötig ist Verwenden Sie die Reflektion, die viel langsamer ist als der normale Methodenaufruf.
MethodHandler ist Teil von JSR 292 . Es richtet sich an Personen, die dynamische Sprachen für JVM implementieren. Sie können mehr darüber hier lesen. Es bedeutet nicht, den regulären Methodenaufruf zu ersetzen.
MethodHandles verwenden Reflektion, also sind sie langsam und nicht leicht umformbar. Darüber hinaus wird Java in Version 8 Lambdas erhalten, und dies wird das Problem der erstklassigen Funktionen in Java lösen, also nehme ich an, dass Bibliotheksautoren lieber auf Java 8 warten, als eine Art Workaround zu verwenden.
Tags und Links java java-7 higher-order-functions