今天在用Netbeans开发一个J2SE项目时碰到的问题:
public MainFrameAdapter(MainFrame mf) {
this.mf = mf;
this.mf.getDisposingButton().addActionListener(this);//在this处提示:构造函数中泄漏this(警告)
}
虽然这只是个警告,以前在eclipse上也都是这么写的,一般情况下似乎也没什么问题。但是心里就是放不下,随之也就到网上去找答案了......
感觉有们同学说的很不错,感觉很有道理,在这里记录下:
这里的“泄露”不是类似于“内存泄露”中的那个“泄露”,这样的警告其实是有道理的,假如在构造函数中把this传出去(即赋值给别的变量),而别的方法如果异步地使用这个this时就有可能在构造方法剩下的语句执行前就访问到这个对象,事实上我在项目中也的确遇到过这样的BUG,在构造方法中把this传给一个TimerTask,程序运行中偶尔会在那个TimerTask里抛出NPE,而为空的那个属性明明是在构造方法里赋了值的,后来才想到就是这个原因。
所以这里的“泄露”的意思其实指的是“在构造方法中把this传出去”,如果确实无法避免这种情况的话最好把这样的语句作为构造方法里的最后一条语句。
在此谢谢"GuuJiang"同学的回答!