Если бы у меня был этот анонимный метод, я должен объявить x переменной как final.Почему переменные должны быть окончательными в анонимных методах и в полях классов не
private void testMethod (ListField<BeanModel> listField){
final ListLoader<BeanModel> loader = new PagedListLoader<BeanModel>();
listField.addListener(Events.Attach, new Listener<ListViewEvent<BeanModel>>() {
@Override
public void handleEvent(ListViewEvent<BeanModel> be) {
loader.load();
}
});
}
Однако, если загрузчик был поле класса, это не было бы необходимо объявить его как окончательный:
public class testClass{
private ListLoader<BeanModel> loader = new PagedListLoader<BeanModel>();
private void testMethod (ListField<BeanModel> listField){
listField.addListener(Events.Attach, new Listener<ListViewEvent<BeanModel>>() {
@Override
public void handleEvent(ListViewEvent<BeanModel> be) {
loader.load();
}
});
//Could I modify loader's reference here, before the method executes?
//loader = null;
}
}
Кто-нибудь знает причину, почему они гарантируют локальные переменные не изменяются, когда они 're accessed, но не делают это для полей классов?
@jlordo. Не совсем. Это сообщение не говорит о полях, а только о локальных переменных. –
Тот же принцип применяется.Это (анонимный) внутренний класс, который ссылается на экземпляр внешнего окружения и, следовательно, может получить доступ к его полям. – jlordo
еще один здесь http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a-differen – kaos