Анонимное объявление внутреннего класса для атрибута экземпляра с использованием другого атрибута экземпляра

При использовании анонимного внутреннего класса внутри метода, когда мы хотим использовать параметр метода внутри анонимного внутреннего класса, мы должны пометить его как окончательный. Некоторые подробности здесь: Почему мы используем ключевое слово 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 после вызова функции?


person Sebastien Lorber    schedule 09.08.2012    source источник


Ответы (1)


Внутренний класс содержит неявную ссылку на this его окружающего экземпляра (т. е. экземпляр его объявляющего класса, в контексте которого он был создан), так что доступ к полям объявляющего класса рассматривается как обычный доступ к полю по этой ссылке.

Итак, ваш внутренний класс увидит текущее значение поля и сможет его изменить.

person axtavt    schedule 09.08.2012