您的位置:首页 > 其它

说下最近遇到的一个引用相关的问题

2018-02-10 15:34 525 查看
现在大家都很注重性能优化,能复用的对象坚决不重复生成,那么问题来了,最近一位同学写了一段这样的代码:public void changeText(final Data data){
if(dialog == null){
dialog = new Dialog(context);
dialog.setContentView(view);
view.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
data.setText("new text");
}
});
}
dialog.show();
}这段代码主要就是实现用户修改数据时,弹出一个dialog让其输入修改内容然后点击确认保存修改。很明显,为了不多生成对象,采用了单例,看上是不是觉得挺好的啊,实际上问题挺大的。
首先说下java内部类引用外部参数,外部变量必须声明为final才能被内部类引用,这是Java为了避免数据不同步的问题,做出了匿名内部类只可以访问final的局部变量的限制。
也就是说,内部类会增加一个常量引用,在内部类被new时,该参数就会被引用到对象里。
那么我们再来看上面的案例,onclicklistener对象只生成了一次,那么其内部的data常量就是第一次调用该方法时传入的data对象,第二次调用并不会修改,所以每次修改实际上是修改了第一个传入对象而并不是每次传入的对象,如果测试不仔细,只测试一次能修改成功就认为可以的话,那么一个潜在bug就这样生成了。
如何修改了,简单点就是每次调用都生成一个onclicklistener对象了,但如果这方法是频繁调用的话,担心对象生成多可能影响性能的话,可以自定义一个onclicklistener类,每次往里set对应的data对象也可以。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐