为什么匿名内部类在使用 final 声明外部对象时调用外部对象


final ArrayAdapter adapter = new ArrayAdapter(...);
listView.setOnItemClickListener(new AdapterView.OnitemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent,View view,int position,long id){
Word word = adapter.getItem(position);
}
});

我不明白为什么匿名内部类调用应该声明为"final"的"适配器"对象?这是规则吗?我应该记住这一点吗? 我知道声明为 final 的变量将保存其引用而不会更改。但是在上面的例子中,引用没有变化,我只是在最终对象上调用一个方法。

这是因为您正在尝试在侦听器中访问适配器(并且您不知道何时会发生(。因此,您需要将其声明为 final,因为这意味着只要您从侦听器获得回调,引用就会相同。销毁函数时,函数内声明的所有非最终引用也将销毁。然后,稍后将在侦听器中尝试访问的引用将不再存在。

因此,您有两种解决方案:将其声明为 final(即使在函数被"销毁"后仍保留引用(或将其声明为全局。

声明内部类final使用的变量是为了让您意识到取消引用可能会发生在另一个线程上或更晚的时间。不进行这些final将需要将它们从堆栈转移到堆上,并提供闭包。显然用户反对它。

看这里: http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg04030.html

最新更新