第一时间获取技术干货和业界资讯!

这两天过节放假,到哪都是人山人海。本文我是打算出去跑跑的,但是奈何小孩有课要上,所以最终就去上海交大转了转。结果交大也是人满为患。到处都是人,车进去都能堵十几分钟。

在交大玩的空闲时间,我收到知乎上一个推送。有人问我,为什么FileInputStream、FileOutputStream等中的finalize方法逐渐被移除了?

说实话,我之前只是了解到,finalize 方法被移除了,但是并没有深究它为什么被移除了。

所以,对于这个问题,我也查阅了一些网上的资料,结果没什么答案来描述这个问题。JDK 官方解释的也很简单,大概意思就是说从 JDK9 开始 finalize 就被弃用了,Java 推荐使用方式是关闭文件的方法是显式调用 close 或使用 try-with-resources。

我这里大胆的大脸一下,说一下 finalize 方法为什么被移除。

第一个,这个方法,我们确实用的不多,留着很鸡肋。

第二个,finalize 方法很危险,或者说用不好它很危险。

第三个,从性能上来说,finalize 方法影响 GC 性能。这一点可以从各种 NIO 框架中的 direct memory 的释放并不是通过 finalize() 来感受。

第四个,从 JDK9 开始,有了更好的 Cleaner 机制。这样 try-with-resources 就显得用起来很方便。

第五个,我们在什么时候去调用 close 方法应该是很明确的。如果通过 finalize 方法去关闭流的话,很容易造成遗漏关闭流的情况。

另外,ZipFile/Inflator/Deflator 中的 finalize 方法也被删除了。

我相信 Java 内部应该有一个各 API 调用的一个指标,至少是可以从各开发者或者开源项目中,获取到这个指标。finalize 方法,使用的人太少了,而且还不安全。没必要还让它存在于 Java 之中,就是你想用这个方法,也可以自己简单的去实现一个类似的方法。