`
vahoa.ma
  • 浏览: 11053 次
  • 性别: 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();  
      }  
   };  
}  

 

分享到:
评论

相关推荐

    C#析构函数

    因此,在设计应用时应尽量避免频繁的资源创建与销毁,并合理使用析构函数或IDisposable接口的Dispose方法。 通过以上的知识点,可以全面了解C#中析构函数的概念、特性以及在内存管理和资源清理中的作用。在实际编程...

    希捷终结者

    "cdll8.dll" 文件可能是一个动态链接库文件,用于提供特定的功能给"希捷终结者"程序使用。DLL文件是Windows操作系统中的一种共享库,它包含了一组函数和资源,多个程序可以同时调用,以节省内存并提高效率。在本例中...

    C#编程艺术:构造函数与析构函数的奥秘

    - **异常安全**:构造函数中应尽量避免抛出异常,以确保对象状态的一致性。如果必须抛出异常,应该提供足够的信息帮助调试。 - **析构函数的限制**:由于析构函数的调用时机不确定,不应依赖其进行关键的资源清理。...

    P2P后台终结者源码

    4. **文件系统交互**:为了读取或写入文件,源码可能会使用到文件I/O操作,这涵盖了标准的文件打开、读取、写入和关闭等函数。 5. **错误处理与日志记录**:一个成熟的项目会包含详尽的错误处理机制,源码中可能有...

    C语言递归函数的执行与求解.pdf

    C语言递归函数是程序设计中的一个重要概念,它指的是在函数内部直接或间接地...然而,递归函数的使用也需要注意,合理的终结条件是保证程序稳定运行的关键,同时在效率和资源消耗方面也要进行权衡,选择最适合的算法。

    终结者远控Rat2.1告别版源码

    4. common:这个目录可能包含了一些通用的函数库或代码片段,这些代码可能被多个组件共享。 5. gh0st:这可能是RAT的主程序或客户端部分,用于建立与被控制设备的连接,并进行交互。 6. Bin:这个目录通常存放编译后...

    LL(1)文法的实现

    在C++中,解析函数通常会是一个递归下降解析器的形式,每个非终结符对应一个函数,函数内部根据当前输入和预测分析表选择下一步的动作。如果解析成功,返回true;否则,返回false并可能抛出错误信息。 在实现过程中...

    USB摄像头偷窥终结者(防止别人偷窥你

    标签“防止 USB摄像头 偷窥”进一步明确了这款软件的核心功能,即对USB摄像头进行安全防护,避免被不法分子用于非法监控。 从压缩包子文件的文件名称列表来看,有两个关键文件: 1. UsbCamSecurity.dll:这是一个...

    全局钩子终结进程

    因此,使用全局钩子需要谨慎,避免滥用。 6. **反作弊应用**:在游戏开发中,全局钩子常被用于反作弊措施,检测和阻止第三方作弊软件的活动。 通过深入理解并熟练掌握全局钩子技术,开发者可以构建功能强大的系统...

    VS终结者.过任何VS

    3. **钩子技术**:利用API钩子来拦截和修改函数调用,防止反作弊系统获取到敏感信息。 4. **网络通信篡改**:VS终结者可能会监控和修改游戏的网络通信,以隐藏非法操作。 5. **进程隐藏**:通过改变进程属性或者创建...

    广告终结者3.1.4.rar

    "广告终结者3.1.4"是一款针对网络广告的拦截软件,它的主要功能是帮助用户在浏览网页、使用应用程序时避免受到各种形式的广告打扰。这款软件的版本号为3.1.4,通常意味着它经过了多次迭代,修复了一些已知问题,并...

    高中数学一对一辅导讲义:终结恒成立问题.pdf

    终结篇部分进一步讨论了与特定数学概念相关的恒成立问题,如零点、单调性、反函数、最值、切线型不等式以及多个变量取值的任意性或存在性。这些问题都要求学生深入理解相关数学概念,并且能够灵活运用所学知识。 ...

    Office系列2010年使用技巧终结版(1300页)

    ### Office系列2010年使用技巧终结版(1300页)——核心知识点精析 #### EXCEL使用六技巧详解 ##### 编辑技巧:掌握数字输入的艺术 1. **分数输入妙招**:直接输入分数如“1/5”,Excel可能会误识别为日期“1月5日...

    sql学习资料课件+终结

    最后,掌握SQL优化技巧也是专业开发者的必备技能,包括合理使用索引、避免全表扫描、减少冗余查询以及利用存储过程来提高执行效率。同时,理解SQL的安全性问题,如权限管理、防止SQL注入攻击,也是确保数据安全的...

    网络填表终结者:FormGhost

    **网络填表终结者——FormGhost** FormGhost是一款专为解决网上繁琐填表问题而设计的高效工具。它简化了在线填写各种表格的过程,极大地提高了工作效率,尤其适用于那些需要频繁填写相同或类似信息的用户,如电商...

    递归下降分析法C语言

    6. **左递归和右递归**:左递归可能导致无限递归,因此在设计解析函数时需要避免。右递归则相对容易处理,可以被直接转换为对应的函数调用。 在实际应用中,递归下降分析法可能需要结合其他技术,如左因子提取、LL...

    递归下降分析法

    递归下降分析的基本思想是将文法的每个非终结符视为一个函数,当解析到该非终结符时,调用相应的函数进行处理。如果非终结符可以被一个或多个产生式替代,那么这个函数就会递归地调用其他函数来解析这些产生式的右侧...

    使用递归下降算法分析数学表达式 使用递归下降算法分析数学表达式 编译原理 课程设计报告.zip

    8. **优化**:为了提高效率,可以引入回溯避免策略,如使用左因子消除或预处理运算符优先级表。 在这个课程设计报告中,学生可能需要实现一个递归下降解析器,用于处理简单的数学表达式,然后分析其性能和正确性。...

    编译原理:算术表达式递归下降分析程序设计[定义].pdf

    5. 递归函数:递归函数是指在程序中使用递归的函数,每个函数的功能是识别由对应的非终结符所表示的语法成分。 6. 语法分析:语法分析是指对文法的分析和解析,以获取文法的语法结构。 7. 编译原理:编译原理是指...

    前端高频面试题终结篇 vue面试题

    21. Vue 组件中 data 为什么必须是函数:Vue 组件中的 data 必须是函数,因为函数可以返回一个新的对象实例,从而避免了组件之间的数据共享。 本文总结了 Vue.js 面试题,涵盖 JavaScript、Git 和 Vue.js 相关知识...

Global site tag (gtag.js) - Google Analytics