При использовании анонимного внутреннего класса внутри метода, когда мы хотим использовать параметр метода внутри анонимного внутреннего класса, мы должны пометить его как окончательный. Некоторые подробности здесь: Почему мы используем ключевое слово final с анонимным внутренние классы?
Но что происходит при использовании атрибута класса, а не локального атрибута метода?
Простой вариант использования: служба Spring с функцией Guava:
protected LovValueDAO lovValueDAO;
private final Function<String,LovValue> LOV_ID_TO_LOV = new Function<String,LovValue>() {
@Override
public LovValue apply(String input) {
return lovValueDAO.findById(input);
}
};
@Required
public void setLovValueDAO(LovValueDAO lovValueDAO) {
this.lovValueDAO = lovValueDAO;
}
Безопасно ли объявлять такую функцию Guava? Согласно моим тестам, он работает нормально, но что происходит под капотом?
Порядок инициализации следующий:
- Функция инициализирована
- lovValueDAO вводится весной через сеттер
Таким образом, я предполагаю, что, поскольку функция инициализируется первой, атрибут lovValueDAO, используемый внутри функции, будет не копией ссылки, а самой ссылкой, поскольку после того, как DAO действительно введен, он работает нормально.
Я прав?
И что произойдет, если я использую этот код:
private final Function<String,LovValue> LOV_ID_TO_LOV = new Function<String,LovValue>() {
@Override
public LovValue apply(String input) {
return lovValueDAO = null;
}
};
Будет ли для моего внешнего атрибута protected LovValueDAO lovValueDAO;
установлено значение null после вызова функции?