Java内部类的this问题
2012-09-06 09:49
274 查看
一轮红日映朝阳
首页
标签
搜索
留言
在一个风和日丽的下午,码农A写了一个可以获取数据的组件,代码是这样的:
码农B负责整个系统开发,使用码农A设计的组件,认为码农A的获取数据应该有个回调函数,就给它加了一个回调函数,代码是这样的:
运行结果一切正常。
在另一个风和日丽的下午,码农A良心发现,觉得自己的组件没有回调函数太不好了,就给自己的组件加了一个回调函数,于是这个组件的2.0版就变成了这样:
码农B已经交差给人干别的去了,结果码农A的看似不影响整个系统的改变却导致了整个系统的瘫痪,运行结果变成了现在这样。
也就是说,码农A的一个功能添加的操作居然也能导致整个系统的瘫痪,实在是匪夷所思,问题出现在哪里呢。其实出现在码农B的代码不规范上,我认为这里是Java的一个设计缺陷。内部类和匿名类的this的多义性导致了其指向的改变。
内部类的this有三种指向:
1、本类的成员,即this.getDataHandle
2、父类的成员,即super.getDataHandle
3、所属类的成员,即MainSystem.this.getDataHandle
其优先级是从1最高3最低,如果强制指定低优先级的this需要改成全称。码农B在this的指向上没有考虑到将来可能会有的的升级,直接指代了优先级最低的对象,是一种很不好的习惯,所以说,this一般来说就指本类的成员,其他七七八八的成员最好使用super或者所属类.this的指代方法,避免类似问题不再发生。
http://blog.gerhut.net/post/54.html
首页
标签
搜索
留言
Java内部类的this问题
2011-9-15 16:23:45
在一个风和日丽的下午,码农A写了一个可以获取数据的组件,代码是这样的:package net.gerhut.example.authora; public class Component { public void getData() { System.out.println("Transferring data..."); }; }
码农B负责整个系统开发,使用码农A设计的组件,认为码农A的获取数据应该有个回调函数,就给它加了一个回调函数,代码是这样的:
package net.gerhut.example.authorb; import net.gerhut.example.authora.Component; public class MainSystem { private Component component; private class MainComponent extends Component { public void getData() { super.getData(); getDataHandle(); } } private MainSystem() { component = new MainComponent(); } private void getDataHandle() { System.out.println("MainSystem Data Refreshed."); } private void refresh() { component.getData(); } public static void main(String[] args) { new MainSystem().refresh(); } }
运行结果一切正常。
Transferring data... MainSystem Data Refreshed.
在另一个风和日丽的下午,码农A良心发现,觉得自己的组件没有回调函数太不好了,就给自己的组件加了一个回调函数,于是这个组件的2.0版就变成了这样:
package net.gerhut.example.authora; public class Component { public void getDataHandle() { System.out.println("Component Data Refreshed."); } public void getData() { System.out.println("Transferring data..."); getDataHandle(); }; }
码农B已经交差给人干别的去了,结果码农A的看似不影响整个系统的改变却导致了整个系统的瘫痪,运行结果变成了现在这样。
Transferring data... Component Data Refreshed. Component Data Refreshed.
也就是说,码农A的一个功能添加的操作居然也能导致整个系统的瘫痪,实在是匪夷所思,问题出现在哪里呢。其实出现在码农B的代码不规范上,我认为这里是Java的一个设计缺陷。内部类和匿名类的this的多义性导致了其指向的改变。
内部类的this有三种指向:
1、本类的成员,即this.getDataHandle
2、父类的成员,即super.getDataHandle
3、所属类的成员,即MainSystem.this.getDataHandle
其优先级是从1最高3最低,如果强制指定低优先级的this需要改成全称。码农B在this的指向上没有考虑到将来可能会有的的升级,直接指代了优先级最低的对象,是一种很不好的习惯,所以说,this一般来说就指本类的成员,其他七七八八的成员最好使用super或者所属类.this的指代方法,避免类似问题不再发生。
http://blog.gerhut.net/post/54.html
相关文章推荐
- Java内部类加载问题探究
- 继承层次中 this,名字查找 导致的成员调用问题
- 搞清this的指向只需问两个问题
- js中的this指向问题
- javascript中盘口类全天快三平台出租this的指向问题
- c++简单问题告知之this指针
- js中的this问题
- Java中有关this的一个问题
- Java面试经典问题(1):Java中this和super的用法总结
- java内部类的作用(一)----解决函数参数返回的问题
- 【转载】Parameter must be a descendant of this view问题的解决方案
- QT手动moc问题:virtual struct QMetaObject const * __thiscall Widget::metaObject
- 刚使用DWR出现问题,DWR engine before including this file
- QT手动moc问题:virtual struct QMetaObject const * __thiscall Widget::metaObject
- The requested URL /phpMyAdmin was not found on this server.问题解决方法
- is not allowed to connect to this MySQL server,想直接解决问题的,可以直接看最后一行
- 关于vs 2005的一个问题, 解决The path "xxxx' maps to a directory outside this application, which is not supported.
- scala中的this.type-这个问题好难懂
- JavaScript 中的this指向问题