effective java —— 终结方法守卫者

目录:

effective java —— 终结方法守卫者

effective java 第2章:创建和销毁对象。第7条 : 避免使用终结方法。最后的“终结方法守卫者 (finalizer guardian)”的例子,以加深理解。

 1 /**
 2  * chapter 2——终结守卫者
 3  * @ClassName: Parent
 4  * TODO
 5  * @author xingle
 6  * @date 2015-3-11 下午3:49:47
 7  */
 8 public class Parent {
 9
10     public static void main(String[] args){
11         doSth();
12         System.gc();
13         try {
14             Thread.sleep(2000);
15         } catch (InterruptedException e) {
16             e.printStackTrace();
17         }
18     }
19
20     /**
21      * TODO
22      * @author xingle
23      * @data 2015-3-11 下午3:51:02
24      */
25     private static void doSth() {
26         Child c = new Child();
27         System.out.println(c);
28     }
29
30     private final Object guardian = new Object(){
31
32         @Override
33         protected void finalize(){
34              System.out.println("执行父类中匿名内部类--终结方法守卫者,重写的finalize()");
35              // 在这里调用Parent重写的finalize即可在清理子类时调用父类自己的清理方法
36              parentlFinalize();
37         }
38     };
39
40     /**
41      * TODO
42      * @author xingle
43      * @data 2015-3-11 下午3:55:10
44      */
45     protected void parentlFinalize() {
46          System.out.println("执行父类自身的终结方法");
47     }
48 }
49
50 class Child extends Parent {
51
52     @Override
53     protected void finalize() {
54         System.out.println("执行子类finalize方法,注意,这里子类并没有调用super.finalize()");
55         // 由于子类(忘记或者其他原因)没有调用super.finalize()
56         // 使用终结方法守卫者可以保证子类执行finalize()时(没有调用super.finalize()),父类的清理方法仍旧调用
57     }
58 }

执行结果:

时间: 2024-09-28 07:42:35

effective java —— 终结方法守卫者的相关文章

和我一起学Effective Java之方法

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute

Effective Java 学习笔记之第七条——避免使用终结(finalizer)方法

避免使用终结方法(finalizer) 终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的. 不要把finalizer当成C++中析构函数的对应物.java中,当对象不可达时(即没有引用指向这个对象时),会由垃圾回收器来回收与该对象相关联的内存资源:而其他的内存资源,则一般由try-finally代码块来完成类似的工作. 一.finalizer的缺点: 1. 终结方法的缺点在于不能保证会被及时地执行. 及时执行finalizer方法是JVM垃圾回收方法的一个主要功

Effective Java 读书笔记之一 创建和销毁对象

一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: 1.静态工厂方法有名称:通过有意义的静态工厂方法名称可以很好的表达工厂方法的作用,易于区别功能相似的多个静态工厂方法. 2.静态工厂方法可以有更复杂的生产对象逻辑,不仅仅是新建一个对象:既可以新建一个对象,也可以使用缓存的对象. 3.静态工厂方法可以返回原返回类型的任何子类型的对象:由于接口不能有

第7条:避免使用终结方法

终结方法(finalize)通常是不可预测的,它不是C++中析构器(destructors)的对应物,Java中一旦对象变的不可达,垃圾回收器会自动回收与该对象相关的存储空间,不需要程序员做专门的工作.C++析构器也可以用来回收其他非内存资源,在Java中,通常用try-finally来完成. 终结方法的缺点: 1.不能保证被及时执行,注重时间的任务不应该由终结方法完成,比如用终结方法关闭已经打开的文件,因为文件描述符是有限的资源,如果大量文件保留在打开状态,当程序不能再打开文件,可能会运行失败

[Effective Java]第二章 创建和销毁对象

第一章      前言 略... 第二章      创建和销毁对象 1.            考虑用静态工厂方法代替构造器 创建对象方法:一是最常用的公有构造器,二是静态工厂方法.下面是一个Boolean的简单示例: public static Boolean valueOf(boolean b) { return (b ? Boolean.TRUE : Boolean.FALSE); } l  静态工厂方法与构造器不同的第一大优势在于,它们有名称. 作用不同的公有构造器只能通过参数来区别(因

Effective Java (7) - 避免使用终结方法

一. 基本概念 1. 所谓的终结方法其实是指finalize(). 2. Java的垃圾回收机制只负责内存相关清理,其他资源的清理(释放文件.释放DB连接)需要程序员手动完成. 3. 调用System.gc() 只是建议JVM执行垃圾回收(GC),但什么时候执行.是否要执行由JVM决定. 4. 用户可以自己调用对象的finalize方法,但是这种调用是正常的方法调用,和对象的销毁过程无关. 5. 如果一个类实现了finalize方法,那么当JVM执行垃圾回收的时候,该方法一定会被调用. publ

[Effective Java]考虑用静态工厂方法代替构造器

本文主要介绍如何使用静态工厂方法已经在那种场合来使用这种方式代替构造方法. 众所周知,对于类而言,我们为了获得一个类的实例对象,通常情况下会提供一个公有的(public) 的构造器.当然除了这种方法以外,我们还可以通过给类提供一个public的静态工厂方法(static factory method)的方式来完成,让它返回一个类的实例. 先看一个简单的Boolean的示例,这个示例将boolean基本类型值转换成一个Boolean对象的引用. public static Boolean valu

Effective java读书札记第一条之 考虑用静态工厂方法代替构造器

对于类而言,为了让客户端获取它资深的一个实例,最常用的方法就是提供一个共有的构造器.还有一种放你发,也应该子每个程序员的工具箱中占有一席之地.类可以提供一个共有的静态 工厂方法,它只是返回类的实例的静态方法. 类可以通过静态工厂方法类提供它的客户端(对象),而不是通过构造器.提这样做的好处有: 1.静态工厂方法与构造器不同的第一大优势在于,它们有名称.比如构造器BigInteger(int,int,Random)返回的BigInteger可能为素数,如果用名为BigInteger.probabl

Effective Java读书笔记(3对于所有对象都通用的方法)

3.1 覆盖equals时请遵守通用约定 什么时候应该覆盖Object.equals()方法呢? 如果类具有自己特有的"逻辑相等"概念(不同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为,这时我们就需要覆盖equals方法. Object.equals()方法具有自反性.对称性.传递性.一致性和与null比较返回false的特点. 实现高质量equals方法的诀窍: (1)使用==操作符检查"参数是否为这个对象的引用".如果是,则返回true,这