说下最近遇到的一个引用相关的问题
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对象也可以。
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对象也可以。
相关文章推荐
- 最近开发遇到一个传值和引用问题 记录一下
- 最近遇到的一个问题,求解释
- 最近遇到了 manifest 的相关问题的记录
- Android pulltorefresh引用遇到的一个问题
- 最近搭建HBase集群时遇到了一个问题,快把我逼疯啦,请各位大神帮我看看该怎么改啊!!!!!
- 一个引用相关问题,延长临时变量的生命周期
- 最近做的一个linux下的聊天系统,遇到的一些问题及解决办法
- 最近遇到一个很蹩脚的问题
- 最近遇到一个问题,怎么修改环境网站访问总会报ASP.NET 4.0错
- 最近一个刚刚毕业的朋友说,他面试时候,遇到最频繁的css问题就是垂直居中,这里给出几种垂直居中方式!
- cordova插件file使用时遇到的一个平台相关的问题
- 最近写一个C#关于U盘的操作,在弹出U盘是遇到了些问题,C#调WINdoWs底层的东西太麻烦了,看样子要看看VC或C了
- Linux环境下段错误的产生原因及调试方法小结 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是
- 最近遇到一个问题,哪位高手能帮忙解答一下
- 最近在使用sprintf构造字符串时遇到的一个问题
- 最近遇到一个问题,FlexPaper去掉logo 打印等东西后无法使用API
- 最近遇到一个很蛋疼的问题 关于View的
- 最近做了一个iOS小应用,记录下遇到的问题以及解决方法
- 最近遇到一个类似淘宝购买商品加减数量然后还得实时更新数据到服务器的问题
- 最近遇到一个非常棘手的需求是关于邮件转发的问题,请大家来帮忙给出出主意如何实现。