Ich bin mir nicht sicher, wie ich mich über die Gleichheit / Unveränderlichkeit der funktionalen Schnittstelle sicher sein kann. Ich denke, dass es keine Möglichkeit gibt, die Gleichheit zu gewährleisten, wenn ich diesen syntaktischen Zucker in Java 8 verwende, lassen Sie mich bitte jeden Hinweis wissen, wenn Sie welche haben.
Ich habe ein kurzes Code-Snippet für meine Frage erstellt.
%Vor%und ich habe versucht, Instanz dieser Schnittstelle in funktioneller Weise hinzuzufügen
%Vor%es gibt true aus, was bedeutet, dass es keine Gleichheitsprüfung gab und ich auch keine Instanz von Set entfernen kann, wenn ich sie einmal hinzugefügt habe.
falls ich die funktionale Schnittstelle als Argument verwende, Gibt es eine Möglichkeit, diese Instanz irgendwie zu vergleichen?
wird jede Hilfe zu schätzen wissen, danke im Voraus!
Sie können Ihre Methodenreferenz in einer Variablen speichern:
%Vor%Auf diese Weise wird false zurückgegeben.
Wenn Sie dieselbe labmda- oder Methodenreferenz in verschiedenen Code-Speicherorten erstellen, entspricht das ungefähr der gleichen Vorgehensweise, mit der Sie eine neue anonyme Klasse in beiden Positionen erstellen würden:
%Vor%Also jedes Mal, wenn es ein anderes Objekt ist, auch wenn es gleich aussieht. Für jede gefundene Methodenreferenz wird zur Laufzeit eine eigene anonyme Klasse erstellt:
%Vor%Die Ausgabe wird wie folgt aussehen:
%Vor% Es sind also praktisch zwei unterschiedliche Objekte aus zwei verschiedenen Klassen. Es wäre ziemlich schwierig zu schlussfolgern, dass sie dasselbe tun, ohne ihren Bytecode zu vergleichen. Beachten Sie auch, dass beide die Variable functionSet
erfassen. Daher sollte auch sichergestellt werden, dass sie zwischen zwei Methodenverweisen nicht geändert wurde.
Die einzige Problemumgehung, die ich mir ausdenken kann, besteht darin, alle Methodenreferenzen als Konstanten in Ihrem Code zu deklarieren und sie später zu referenzieren, anstatt Methodenreferenzen direkt zu verwenden:
%Vor%Tags und Links java java-8 equality immutability functional-interface