Sind Stack-Traces weniger navigierbar, wenn Methodenverweise vs Lambdas verwendet werden?

8

Ich habe gerade ein schnelles Experiment in Eclipse durchgeführt.

%Vor%

Wenn der Methodenreferenztest fehlschlägt, beginnt die Ablaufverfolgung

%Vor%

Es gibt keine Referenz zurück zu der Linie, auf der die Methodenreferenz verwendet wird, obwohl das Ende der Kurve (nicht gezeigt) mit findFirst on zurück auf die Linie verweist.

Während der Stack-Stack von lamdba beginnt

%Vor%

In Zeile 26 wurde das Lambda korrekt identifiziert.

Ist das eine Eigenheit des Eclipse-Compilers oder ist dies ein genereller Nachteil der Verwendung von Methodenreferenzen, die bei der Auswahl zwischen ihnen und einem Lambda berücksichtigt werden sollten?

    
henry 13.11.2015, 11:45
quelle

2 Antworten

4

Nein, so ist es derzeit implementiert.

Zitieren ein Papier von Brian Goetz über die Übersetzung von Lambda-Ausdrücken:

  

Wenn der Compiler auf einen Lambda-Ausdruck stößt, wird der Lambda-Body zuerst (desugars) in eine Methode reduziert, deren Argumentliste und Rückgabetyp mit der des Lambda-Ausdrucks

übereinstimmen      

...

     

Methodenreferenzen werden genauso behandelt wie Lambda-Ausdrücke, mit der Ausnahme, dass die meisten Methodenreferenzen nicht in eine neue Methode entzuckt werden müssen; Wir können einfach eine Konstante für die referenzierte Methode laden und diese an die Metafactory übergeben.

Der einzige Unterschied zwischen Ihren beiden Stacktraces besteht darin, dass der Zeile mit dem expliziten Lambda diese Zeile hinzugefügt wurde:

%Vor%

Dies liegt daran, dass das Lambda von javac in eine neu generierte Methode übersetzt wurde, und Sie können tatsächlich im Stacktrace sehen, dass diese neue Methode lambda%code% war.

Bei einer Methodenreferenz muss keine neue Methode generiert werden, da sie direkt auf eine vorhandene Methode verweist.

    
Tunaki 13.11.2015, 12:00
quelle
2

Nein - in der Tat erhalten Sie mehr Klarheit.

Die Tatsache, dass die Zeile at com.example.StackTractTest.lambda%code%(StackTractTest.java:26) in der Lambda-Version erscheint, erinnert Sie daran, dass ein Lambda für diese Technik erstellt wird, während eine Methodenreferenz nichts extra erzeugt.

Das Lambda wird zur Laufzeit erstellt, die Methodenreferenz kann zur Kompilierzeit erstellt werden.

    
OldCurmudgeon 13.11.2015 11:55
quelle