Wenn Lambda-Ausdruck verwendet wird, erstellt Java eine anonyme (nicht statische) Klasse. Nicht statische innere Klassen enthalten immer Referenzen auf ihre umschließenden Objekte.Gibt es eine Möglichkeit für Java-Lambda-Ausdruck, keine Referenz auf ein umschließendes Objekt zu haben?
Wenn dieser Lambda-Ausdruck aus einer anderen Bibliothek aufgerufen wird, die Lambda in einem anderen Prozess aufrufen kann, stürzt der Aufruf mit der Ausnahme Klasse nicht gefunden ab, weil die Klasse des umschließenden Objekts in einem anderen Prozess nicht gefunden werden kann.
Betrachten Sie dieses Beispiel:
public class MyClass {
public void doSomething() {
remoteLambdaExecutor.executeLambda(value -> value.equals("test"));
}
}
Java wird eine anonyme innere Klasse, die bestimmte funktionelle Schnittstelle implementiert und es als Parameter an executeLambda() übergeben. Dann nimmt remoteLambdaExecutor diese anonyme Klasse über den gesamten Prozess zur Remote-Ausführung. Remote-Prozess weiß nichts über MyClass und werfen
java.lang.ClassNotFoundException: MyClass
Weil es MyClass für das einschließende Objekt Referenz benötigt.
Ich kann immer eine statische Implementierung der funktionalen Schnittstelle verwenden, die von einer API erwartet wird, aber das verhindert den Zweck und verwendet keine Lambda-Funktionalität.
Gibt es eine Möglichkeit, es mit Lambda-Ausdrücken zu lösen?
UPDATE: Ich kann auch keine statische Klasse verwenden, es sei denn, sie wird irgendwie in diesen anderen Prozess exportiert.
'kann Lambda in einem anderen Prozess aufrufen': klingt wie ein Chiasmus – wero
Vielleicht ist Java die falsche Sprache dafür. Vielleicht brauchen Sie eine Skriptsprache. –