一个让我很无语的bug
2016-05-12 20:04
369 查看
被一个诡异的bug折腾了半天,当找到原因时哭笑不得。先看如下代码,大家分析一下打出来的会是什么:
按理说这里给name设置成orange,打出来的应该是orange才对,但事实上打出来的是name。很奇怪吧,原因在哪里?
原因在于这个PropSetter内部也有一个成员变量为name,没有加修饰符,所以默认为protected。在回调里,这个name的优先级高于setPropName的参数name,所以被抢占了。解决办法很简单,给PropSetter的name改成private的,或者干脆别让他们名称冲突就可以了。
public class TestDebug { private static HashMap<String, BleDeviceProp> mPropCache = new HashMap<String, BleDeviceProp>(); public static void main(String[] args) { // TODO Auto-generated method stub BleDeviceProp prop = new BleDeviceProp("one"); prop.name = "apple"; mPropCache.put(prop.mac, prop); setPropName(prop.mac, "orange"); System.out.println(prop.name); } private static class BleDeviceProp { private String mac; private String name; BleDeviceProp(String mac) { this.mac = mac; } } private static void setPropName(String mac, String name) { setProp(mac, new PropSetter("name") { @Override public boolean setProp(BleDeviceProp prop) { // TODO Auto-generated method stub prop.name = name; return false; } }); } private static void setProp(String mac, PropSetter setter) { BleDeviceProp prop = mPropCache.get(mac); if (prop == null) { prop = new BleDeviceProp(""); mPropCache.put(mac, prop); } setter.setProp(prop); } private interface IPropSetter { boolean setProp(BleDeviceProp prop); } private static abstract class PropSetter implements IPropSetter { String name; PropSetter(String name) { this.name = name; } } }
按理说这里给name设置成orange,打出来的应该是orange才对,但事实上打出来的是name。很奇怪吧,原因在哪里?
原因在于这个PropSetter内部也有一个成员变量为name,没有加修饰符,所以默认为protected。在回调里,这个name的优先级高于setPropName的参数name,所以被抢占了。解决办法很简单,给PropSetter的name改成private的,或者干脆别让他们名称冲突就可以了。
相关文章推荐
- 显示gcc内置宏
- PAT 1022
- Eviews 9.0新功能——估计方法(ARDL、面板自回归、门限回归)
- 第七周项目3——用多文件组织多个类的程序
- Calendar和Date的用法
- C++中的类与对象
- Android开发常用的adb命令整理
- UVA1225
- http协议,全部看懂面试就成功了一半
- 0512 操作系统之进程调度
- [MEF] 学习之一 入门级的简单Demo(转)
- vue-cli学习开发总结
- easyui --单元格编辑
- android IDE——通过DDMS查看app运行时所占内存情况
- sysenter HOOK反OD调试
- python ssh到linux
- IO流
- Android手机之间Socket通信
- JDBC批量插入
- 不用客户端也能下载网页视频