У меня есть анонимный внутренний класс и эквивалентная лямбда. Почему правила инициализации переменных более строгие для лямбда, и есть ли решение более чистое, чем анонимный внутренний класс или инициализация его в конструкторе?
import java.util.concurrent.Callable;
public class Immutable {
private final int val;
public Immutable(int val) { this.val = val; }
// Works fine
private final Callable<String> anonInnerGetValString = new Callable<String>() {
@Override
public String call() throws Exception {
return String.valueOf(val);
}
};
// Doesn't compile; "Variable 'val' might not have been initialized"
private final Callable<String> lambdaGetValString = () -> String.valueOf(val);
}
Изменить: я столкнулся с одним обходным путем: используя getter для val
.