`
vahoa.ma
  • 浏览: 10367 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

避免使用终结函数

    博客分类:
  • java
阅读更多

终结函数(finalizer)通常是不可预测的,常常也是很危险的,一般情况下不是必要的。使用终结函数会导致不稳定的行为、更差的性能,以及带来移植性问题。不要把终结函数当做C++中的析构函数(destructors)的对应物。

 

    我自己总结了一下这一条的综合性结论是这样的:

1)在涉及使用资源,使用完毕后要释放资源的情形下,首先要用一个显示的方法(应该是私有的)来释放这些资源;

2)在主方法中通过 try-catch-finally 的结构结合起来,try中写正常操作的代码,catch中处理异常,如写Log等,finally中通过调用1)中的显示的资源释放方法来释放资源(使用finally是因为不论成功还是异常都要释放资源)

3)用终结函数作为“安全网”,防止程序员忘记了2)中的“调用1)中的显示的资源释放方法”。这样迟一点释放资源也总比忘记释放要好;

4)进而用“终结守卫者”来代替3)中的终结函数,这样的好处是,如果这个类被子类继承,而子类的终结函数又忘记调用它的父类的终结函数时,如果父类是用“终结守卫者”来代替“终结函数”的话,就不怕子类遗忘此事了,即使子类的终结函数没有调用,父类的“终结守卫着”也会被执行的。

public class Example{  
   public void doSomething(){  
      try{  
         // 打开资源并使用  
      ......  
      } catch XXXException e {  
         ......  
      } finally {  
         release();  
      }  
   }  
  
   protected void release(){  
      // 释放资源  
    .......  
   }  
  
   private final Object finalizerGuardian = new Object(){  
      protected void finalize() throws Throwable{  
          release();  
      }  
   };  
}  

 

分享到:
评论

相关推荐

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    7.4.4 在构造函数中使用初始化列表 316 7.4.5 声明显式的构造函数 317 7.5 类的私有成员 318 7.5.1 访问私有类成员 320 7.5.2 类的友元函数 321 7.5.3 默认复制构造函数 323 7.6 this指针 325 7.7 类的const...

    c-minus词法分析器

    所有的变量和函数在使用前必须声明(这避免了向后b a c k p a t c h i n g引用)。程序中最后的声明必须是一个函数声明,名字为m a i n。注意,C-缺乏原型,因此声明和定义之间没有区别(像C一样)。 4. var_...

    matlab蓝色代码表示-knife:优雅的C++11语法糖,适用于使用Python,SQLite和Bash进行混合语言编程

    可以直接编写这些语言,而无需进行诸如初始化和终结之类的琐碎工作 避免sprintf(...)支持和机制 只要变量名称在C ++和那些语言中相同,就可以很好地操作变量 跨平台支持,通过方便的加速接口实现多线程加速 可扩展以...

    控制增益符号未知的不确定非线性系统鲁棒自适应控制

    用积分型Lyapunov 函数避免了控制器奇异性问题, 并通过引入神经网络逼近误差和不确定干扰上界的自适应补偿 项消除了建模误差和不确定干扰的影响. 理论分析证明了闭环系统所有信号半全局一致终结有界, 仿真结果...

    不确定非线性系统的自适应反推终端滑模控制 (2012年)

    通过引入一阶滤波器,不仅避免了传统反推控制存在的复杂计算,提高了系统的收敛速度,而且通过引入逼近误差和不确定干扰上界的自适应补偿项来消除建模误差和参数估计误差的影响,改善了稳态跟踪精度。理论分析证明闭环...

    带有未建模动态的非线性系统的自适应动态面控制

    通过在传统后推设计中引入一阶滤波器, 避免了对虚拟控制反复求导而导致的计算复杂性问题. 利用Young’s 不等式 和积分型李亚普诺夫函数, 有效地减少了可调参数的数目, 无需虚拟控制增益系数导数的信息. 理论...

    NET设计规范-.NET约定、惯用法与模式.part2

    3.2.3 避免使用语言特有的名字 38 3.2.4 为已有API的新版本命名 39 3.3 程序集和DLL的命名 42 3.4 名字空间的命名 43 3.5 类、结构和接口的命名 47 3.5.1 泛型类型参数的命名 49 3.5.2 常用类型的命名...

    具有未建模动态系统的自适应动态面输出反馈控制

    通过对未建模动态的新刻画, 避免动态信号的引入. 采用动态面设计方法, 取消理论分析中产生的未知连续函数的估计, 降低设计的复杂性. 利用Lyapunov 方法证明了闭环系统的所有信号是半全局一致终结有界的, 并通过仿真...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    9.7.2 使用using语句进行确定性终结 282 9.7.3 垃圾回收、终结和IDisposable 284 9.8 推迟初始化 286 9.9 小结 288 第10章 异常处理 289 10.1 多异常类型 289 10.2 捕捉异常 291 10.3 常规...

    NET设计规范-.NET约定、惯用法与模式.part1

    3.2.3 避免使用语言特有的名字 38 3.2.4 为已有API的新版本命名 39 3.3 程序集和DLL的命名 42 3.4 名字空间的命名 43 3.5 类、结构和接口的命名 47 3.5.1 泛型类型参数的命名 49 3.5.2 常用类型的命名...

    asp.net知识库

    在 SQL Server 2005 中使用表值函数来实现空间数据库 SQL Server 2005的30个最重要特点 同时安装sql2000和sql2005的经验 类如何与界面绑定 在Asp.net中如何用SQLDMO来获取SQL Server中的对象信息 使用Relations建立...

    shredder:垃圾收集了Rust的智能指针

    碎纸机 shredder是一个提供垃圾回收智能指针Gc 。 这在您希望共享访问某些数据但数据结构中具有不可预测的周期时非常... 受保护的访问:访问Gc数据需要获得保护(尽管在许多情况下您可以使用DerefGc来避免这种情况)

    不确定非线性系统的自适应反推高阶终端滑模控制

    − 1 步利用神经网络逼近未知非线性函数, 结合动态面控制设计虚拟控制律, 避免传统反推设计存在的计算复杂性 问题, 并抑制非匹配不确定性的影响; 第?? 步结合非奇异终端滑模设计高阶滑模控制律, 去除控制抖振,...

    Java并发编程实战

    书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高...

    Rust 的 LR(1) 解析器生成器

    为此,LALRPOP 提供了许多漂亮的功能:万一解析器构造函数失败的错误消息。允许您提取语法的公共部分的宏。这意味着您可以超越像Id*这样的简单重复,并为逗号分隔的标识符列表定义诸如Comma类的东西。宏还可以创建...

    《垃圾收集》(Garbage Collection)扫描版[PDF]——part2

    3.5.1 函数式程序设计语言 3.5.2 Bobrow的技术 3.5.3 弱指针算法 3.5.4 部分标记——清扫算法 3.6 需要考虑的问题 3.7 引文注记 第4章 标记——清扫垃圾收集 4.1 与引用计数技术的比较 4.2 使用标记栈 4.2.1 显式地...

    (Garbage Collection)扫描版——part1

    3.5.1 函数式程序设计语言 3.5.2 Bobrow的技术 3.5.3 弱指针算法 3.5.4 部分标记——清扫算法 3.6 需要考虑的问题 3.7 引文注记 第4章 标记——清扫垃圾收集 4.1 与引用计数技术的比较 4.2 使用标记栈 4.2.1 显式地...

    tonyCode抽奖系统(原HTML+JS抽奖系统)V4.0

    2017-1-23 新增了保存配置文件是否下次跳过“引导页设置界面”选项,改进了保存等函数的效率及不兼容问题 2017-1-23 实现了扩展屏幕的自适应(存在扩展屏幕默认投放到扩展屏幕,否则就本地监视器显示) 2017-1-23 ...

Global site tag (gtag.js) - Google Analytics