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

时间:2017-08-15 03:15:13

标签: java android 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);
    }
});

我无法理解为什么匿名内部类会调用&#34;适配器&#34;应声明的对象&#34; final&#34; ?这是一个规则吗?我应该记得吗? 我知道声明final的变量会保存它的引用而不会改变。但是在上面的例子中,没有引用的变化,我只是在最终对象上调用一个方法。

2 个答案:

答案 0 :(得分:1)

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

所以你有两个解决方案:将它声明为final(并在函数被“销毁”后保留引用)或将其声明为全局。

答案 1 :(得分:0)

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

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