Как получить доступ к переменным экземпляра конструктора внутри класса, который будет использоваться внутри лямбды - PullRequest
0 голосов
/ 22 февраля 2019

Класс 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();
  };
}

Мне просто интересно узнать, есть ли лучший способ использовать переменную экземпляра внутри лямбда-выражения, а не анонимный класс?

Примечание: Iпредпочитаю вести учет как окончательный.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Есть некоторые различия между анонимным классом и лямбдой.В этом случае основной является:

Компиляция - анонимный компилируется в класс, тогда как лямбда - это вызываемая динамическая инструкция

Теперь об ошибке компилятора.По Порядку 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();
//        };
    }
}
0 голосов
/ 22 февраля 2019

Переместить lambdaCallable определение внутрь конструктора:

private final Callable<Long> lambdaCallable;
@Autowired
public Customer(final Novel account) {
   this.account = account;
   lambdaCallable = account::getId;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...