您的位置:首页 > 编程语言 > Java开发

Java内部类的this问题

2012-09-06 09:49 274 查看
一轮红日映朝阳

首页

标签

搜索

留言


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: