2014-12-01 16 views
6

Ich versuche Java 8 Lambdas zu verwenden und habe eine allgemeine Frage zur Objektserialisierung. Zum Beispiel gibt die folgende Eingabe 5 aus, wenn executor.execute nur eine Methode hat und den Codeblock ohne Serialisierung ausführt. Wenn ich jedoch den Lambda-Ausdruck über SerializedLambda serialisiere und ihn wieder deserialisiere, wird Null ausgegeben, da der vorherige Kontext in diesem neuen deserialisierten Objekt nicht vorhanden ist. Darüber hinaus kompiliert es ohne jede Beschwerde, da der erste Kontext äußere Variablen auflöst. (FinalVar in diesem Beispiel):Einschließen von externen Variablen beim Serialisieren eines Objekts

final int finalVar = 5; 
executor.execute(() -> { 
    System.out.println(finalVar); 
}); 

Ich frage mich, ob es möglich ist, die SerializedLambda zu sagen finalVar in Serialisierung Auftrag ausgegeben werden, ohne dass eine Schnittstelle implementiert, die ein Feld für finalVar Variable hat und den Wert davon auf ein Feld, wenn Konstruieren. AFAIK ist dies die sauberste Weg, so etwas in Java zu tun:

final int finalVar = 5; 
executor.execute(new Runnable() { 
    int myVar = finalVar; 

    public void run() { 
     System.out.println(myVar); 
    } 
); 

ich darüber nicht einmal sicher bin, aber ich denke, der Compiler die außerhalb Variablen herausfinden können, und auch serialisiert werden und sie umfassen, wenn ich versuche, serialisieren, dass Lambda. Gibt es einen Trick für Java, um so etwas zu tun, oder gibt es eine Sprache, die eine solche Funktion hat?

+0

Ja, serialisierte Lambdas sollten automatisch erfasste Variablen ohne besondere Magie enthalten. –

+0

Vielleicht ist es mit dem hier beschriebenen Eclipse-Fehler verwandt: http://stackoverflow.com/questions/23837215/java-8-lambdas-that-access-instance-fields-and-methods-cant-be-deserialized –

+0

Was sind Ihre OS/IDE/Java-Versionen? Ich kann das nicht reproduzieren. – alexh

Antwort

0

Unabhängig vom Variablenbereich enthalten serialisierte Lambdas externe Variablen, solange die Typen dieser Variablen Serializable sind. Stellen Sie sicher, dass das der Fall ist und Sie sind gut zu gehen.

Verwandte Themen