Как получить доступ к переменным экземпляра конструктора внутри класса, который будет использоваться внутри лямбды
Класс Customer использует внедрение конструктора (рекомендуется поверх внедрения поля), но поле экземпляра нельзя использовать внутри лямбда-выражения.
@Component
public class Customer {
private final Account account;
@Autowired
public Customer(final Account account) {
this.account = account;
}
// Works perfectly fine
Callable propCallable = new Callable<String>(){
@Override
public String call() throws Exception {
return account.accountId();
}
};
//Shows warning : Variable account might not have been initialized
Callable lambdaCallable = () -> {
return account.accountId();
};
}
Мне просто любопытно узнать, есть ли лучший способ использовать переменную экземпляра внутри лямбды, а не анонимный класс?
Примечание: я предпочитаю вести учет как окончательный вариант.
заранее спасибо
2 ответа
Есть некоторые различия между анонимным классом и лямбдой. В этом случае основным является:
Компиляция - анонимный компилируется в класс, в то время как лямбда-это динамическая инструкция
Теперь об ошибке компилятора. В соответствии с Java-порядком правил инициализации, ваша лямбда-инициализация происходит до назначения "account" в конструкторе. Не уверен, но в анонимном классе такой ошибки нет из-за разницы в компиляции.
Таким образом, вы можете вернуть лямбду из метода или перенести инициализацию lambdaCallable в конструктор.
public class DemoApplication {
public class Customer {
private final Account account;
public Customer(final Account account) {
this.account = account;
}
// Works perfectly fine
Callable propCallable = new Callable<String>(){
@Override
public String call() throws Exception {
return account.accountId();
}
};
Callable getCallable() {
return account::getId;
}
// Callable lambdaCallable = () -> {
// return account.accountId();
// };
}
}
Переехать lambdaCallable
определение внутри конструктора:
private final Callable<Long> lambdaCallable;
@Autowired
public Customer(final Novel account) {
this.account = account;
lambdaCallable = account::getId;
}