`
tedeyang
  • 浏览: 319038 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

寻求正解:变量引用的疑问。

OS 
阅读更多



 public final void close() throws IOException {
  OutputStream os = _os;
  _os = null;

  if (os != null) {
    os.close();
 }

}

看了上面一段代码,我左思右想,觉得没有必要搞这么麻烦。_os,os不都是指向同一个对象吗,干嘛要把_os先null掉再关闭os?
唯一的可能原因是不是这样的:

_os是类变量,它的生存周期与类对象相同,而os是方法内的变量,方法调用结束后os就可以被GC收集了。两者的生存周期不同,这样写代码有利于垃圾收集。再想想这也不对,垃圾收集的目标是对象而不是引用,OutputStream对象被os引用了,所以必然好好的呆着呢。
莫非是为了防止close()时_os被外部同时调用?

奇怪的做法。这种代码在hessian里到处都是,我实在没有想通玄机。个人觉得是没有必要的,大家怎么看?

 

【2008-2】

 

分享到:
评论
2 楼 tedeyang 2010-03-03  
fuliang 写道


os过了方法体就不再作用域中了,所以原先os引用的对象就可以直接被回收了。

public final void close() throws IOException {
   if (_os != null) {
    _os.close();
    _os = null;
}

}
这样写不也一样嘛?为什么要多转一层?
1 楼 fuliang 2010-03-03  
引用
_os是类变量,它的生存周期与类对象相同,而os是方法内的变量,方法调用结束后os就可以被GC收集了。两者的生存周期不同,这样写代码有利于垃圾收集。

就是你说的这样。
引用

OutputStream对象被os引用了,所以必然好好的呆着呢。

os过了方法体就不再作用域中了,所以原先os引用的对象就可以直接被回收了。

相关推荐

Global site tag (gtag.js) - Google Analytics