Включение внешних переменных при сериализации объекта

Я пытаюсь использовать Java 8 лямбды и у меня есть общий вопрос о сериализации объектов. Например, следующий ввод печатает 5, если executor.execute имеет только один метод и выполняет блок кода без его сериализации. Однако, если я сериализую лямбда-выражение через SerializedLambda и десериализовываю его обратно, он печатает ноль, поскольку у него нет предыдущего контекста в этом новом десериализованном объекте. Более того, он компилируется без каких-либо жалоб, поскольку первый контекст разрешает внешние переменные. (finalVar в этом примере):

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

Интересно, можно ли сказать SerializedLambda включить finalVar в вывод сериализации без реализации интерфейса, имеющего поле для переменной finalVar, и установить его значение в поле при построении. AFAIK, это самый чистый способ сделать такую ​​вещь в Java:

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

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

Я даже не уверен в этом, но я думаю, что компилятор может обнаружить внешние переменные, а также сериализовать и включить их, когда я пытаюсь сериализовать эту лямбду. Есть ли хитрость для Java, чтобы сделать такую ​​вещь, или есть язык, который имеет такую ​​функцию?

1 ответ

Решение

Независимо от области видимости переменных, сериализованные лямбды будут включать внешние переменные, если типы этих переменных Serializable, Убедитесь, что это так, и вы готовы идти.

Другие вопросы по тегам