Включение внешних переменных при сериализации объекта
Я пытаюсь использовать 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
, Убедитесь, что это так, и вы готовы идти.