文档章节

effective java读书笔记7:避免使用总结方法

silence88
 silence88
发布于 2017/01/21 13:21
字数 973
阅读 15
收藏 0

解读:java中的任何对象都是Object的子类,Obejct提供了一个finalize方法,这个方法就是终结方法,由于该方法是不可预测(不受调用者控制)的,因此尽量避免使用该方法去做终结的操作,例如打开一个文件,依赖终结方法去做关闭是不可取的。

  • 我们先看下JDK的api上如何解释finalize方法的。

当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。

finalize 的常规协定是:当 JavaTM 虚拟机已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非由于准备终止的其他某个对象或类的终结操作执行了某个操作。finalize 方法可以采取任何操作,其中包括再次使此对象对其他线程可用;不过,finalize 的主要目的是在不可撤消地丢弃对象之前执行清除操作。例如,表示输入/输出连接的对象的 finalize 方法可执行显式 I/O 事务,以便在永久丢弃对象之前中断连接。

  • 对于终结方法,作者的意见是不要完全依赖于提供终结方法去做终结的操作,为什么呢?

1、终结方法的缺点在于不能保证会被及时地执行。这一点通过api上对该方法的说明就可以很好理解,因为你不确定垃圾回收器何时会回收该类,也就没法确定finalize方法何时执行。

2、终结方法可能不会被执行。这种可能性是很大的,当一个程序终止的时候,无法访问的对象上的终结方法是根本不会执行的,文中也提到了对于很重要的操作千万不要依赖终结方法去做,因为不靠谱!例如下面自己写的简单例子。

public class Person {

	@Override
	protected void finalize() throws Throwable {
		// TODO Auto-generated method stub
		super.finalize();
		System.out.println("执行finalize方法");
	}
	
	public static void main(String[] args) {
		Person p = new Person();
        p=null;
		System.out.println("main执行完毕");
		System.gc();
	}
	
}

如果我在main中不调用System.gc()方法,就不会执行finalize方法。(当然文中也说了及时调用System.gc()也有可能不执行终结方法,这点就不去细究了)

另外终结方法不一定执行还有一种可能性是本身你写的终结方法抛了异常,会导致方法终端。

3、有严重的性能问题。

因此针对总结方法存在这些缺陷,需要在设计该类的时候,提供显示的终止方法,由调用者确定该类实例不再有用的时候调用类提供的显式终止方法。例如InputStream等类就提供了close方法供使用者调用。有一点规范文中提了就是要使用try-finally结构去保证及时终止。

  • 下面谈谈终结方法(finalize)的用途:

1、作为安全网的角色,也就是说可能提供的显式终结方法调用者忘记调用了,通过提供该方法能做一定的防护。当然由于上面也提到了finalize方法会影响性能,一次在实际的开发当中,还得合理考虑是否有必要提供。对于Jdk的FileInputStream、FileOutputStream、Timer、Connection等这些类虽然都提供了显示的终结方法,但是也都重写了finalize方法。

2、第二个用途:没看明白意思,后面补充。

不过有一点值得注意:为什么要在类中写匿名类来写终止方法??

 

 

© 著作权归作者所有

silence88
粉丝 8
博文 71
码字总数 72855
作品 0
深圳
程序员
私信 提问
读书笔记之《Java并发编程的艺术》-并发编程容器和框架(重要)

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
722
1
读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
754
1
Android--面试中遇到的问题总结(三)

《Android 开发工程师面试指南 LearningNotes 》,作者是陶程,由梁观全贡献部分。大家可以去知乎关注这两位用心的少年。这份指南包含了大部分Android开发的基础、进阶知识,不仅可以帮助准备...

sealin
2017/02/22
0
0
读书笔记之《Java并发编程的艺术》-并发编程基础

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
4K
8
Java自定义Exception

这里总结一下Java的Exception,并实现一个自定义Exception类。 总结: Throwable对象分为两种类型:Error(表示编译时和系统错误);Exception(在Java类库、用户方法以及运行时故障中抛出的异常...

Triangle23
2014/12/02
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
10
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部