Können Java MethodHandles als erstklassige Funktionen betrachtet werden?

9

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.

    
Luciano 13.12.2011, 02:27
quelle

4 Antworten

3

Abgesehen von irgendwelchen Leistungsargumenten, die Methods oder MethodHandles weitergeben:

  • verliert jegliche Kompilierzeitsicherheit:
    • Anzahl der Argumente;
    • Arten von Argumenten;
    • die Existenz der Methode selbst (Sie verwenden einen String-Namen, um sie zu finden).
  • verliert alle deklarierten geprüften Ausnahmen;
  • erschwert automatisiertes Refactoring.

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.

    
Dan Vinton 13.12.2011, 10:55
quelle
0

Verwenden Sie Reflektionen nur, wenn Sie wirklich brauchen. Wie Sie sehen, wirft throw Throwable, was bedeutet, dass Sie keine wirklich gute Ausnahmebehandlung bekommen. Auch andere Kompilierzeitprüfungen werden verworfen.

    
jontro 13.12.2011 09:31
quelle
0

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.

    
edwardw 13.12.2011 11:00
quelle
0

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.

    
solendil 13.12.2011 11:02
quelle