Effective Java笔记(8)避免使用终结方法和清除方法

Effective Java(中文版第3版)笔记 创建和销毁对象 第1条:用静态工厂方法代替构造器 第2条:遇到多个构造器参数时要考虑使用构建器 建造者模式 第3条:用私有构造器或者枚举类型强化 Singleton 属性 三种实现单例的方法,注意防止使用反射,可以修改构造器,让它在被要求创建第二个实例的时候抛出异常。 最佳方式是枚举实现。 第4条:通过私有构造器强化不可实例化的能力 第5条:优先考虑依赖注入来引用资源 不要用 Singleton 和静态工具类来实现依赖一个或多个底层资源的类,且该资源的行为会影响到该类的行为 ;也不要直接用这个类来创建这些资 阅读详情

        终结方法( finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的 。 使用终结方法会导致行为不稳定 、 性能降低,以及可移植性问题 。 当然,终结方法也有其可用之处,我们将在本条目的最后再做介绍;但是根据经验,应该避免使用终结方法 。 在 Java 9中用清除方法( cleaner )代替了终结方法 。 清除方法没有终结方法那么危险,但仍然是不可预测、运行缓慢,一般情况下也是不必要的 。

        终结方法和清除方法的缺点在于不能保证会被及时执行[JLS.12.6]。 从一个对象变得不可到达开始,到它的终结方法被执行,所花费的这段时间是任意长的 。 这意味着, 注重时间的任务不应该由终结方法或者清除方法来完成 。 例如,用终结方法或者清除方法来关闭已经打开的文件,就是一个严重的错误,因为打开文件的描述符是一种很有限的资源 。 如果系统无法及时运行终结方法或者清除方法就会导致大量的文件仍然保留在打开状态,于是当一个程序再也不能打开文件的时候,它可能会运行失败 。

        及时地执行终结方法和清除方法正是垃圾回收算法的一个主要功能,这种算法在不同的 JVM 实现中会大相径庭 。 如果程序依赖于终结方法或者清除方法被执行的时间点,那么这个程序的行为在不同的 JVM 中运行的表现可能就会截然不同 。 一个程序在你测试用的JVM 平台上运行得非常好,而在你最重要顾客的 JVM 平台上却根本无法运行,这是完全有可能的 。

        延迟终结过程并不只是一个理论问题 。 在很少见的情况下,为类提供终结方法,可能会随意地延迟其实例的回收过程 。 一位同事最近在调试一个长期运行的 GUI 应用程序的时候,该应用程序莫名其妙地出现 OutOfMemoryError 错误而死掉 。 分析表明,该应用程序死掉的时候,其终结方法队列中有数千个图形对象正在等待被终结和回收 。 遗憾的是,终结方法线程的优先级比该应用程序的其他线程的优先级要低得多,所以,图形对象的终结速度达不到它们进入队列的速度 。Java 语言规范并不保证哪个线程将会执行终结方法,所以,除了不使用终结方法之外,并没有很轻便的办法能够避免这样的问题 。 在这方面,清除方法比终结方法稍好一些,因为类的设计者可以控制自己的清除线程, 但清除方法仍然在后台运行,处于垃圾回收器的控制之下,因此不能确保及时清除 。

        Java 语言规范不仅不保证终结方法或者清除方法会被及时地执行,而且根本就不保证它们会被执行 。 当一个程序终止的时候,某些已经无法访问的对象上的终结方法却根本没有被执行,这是完全有可能的 。 结论是:永远不应该依赖终结方法或者清除方法来更新重要的持久状态 。 例如,依赖终结方法或者清除方法来释放共享资源(比如数据库)上的永久锁,这很容易让整个分布式系统垮掉 。

        不要被 System.gc 和 System.runFinalization 这两个方法所诱惑,它们确实增加了终结方法或者清除方法被执行的机会,但是它们并不保证终结方法或者清除方法一定会被执行 。 唯一声称保证它们会被执行的两个方法是 System.runFinalizersOnExit,及其臭名昭著的孪生兄弟 Runtime.runFinalizersOnExit 。 这两个方法都有致命的缺陷,井且已经被废弃很久了。

        使用终结方法的另一个问题是:如果忽略在终结过程中被抛出来的未被捕获的异常,该对象的终结过程也会终止。 未被捕获的异常会使对象处于破坏的状态( corrupt state ),如果另 一个线程企图使用这种被破坏的对象,则可能发生任何不确定的行为 。 正常情况下,未被捕获的异常将会使线程终止,并打印出战轨迹( Stack Trace ),但是,如果异常发生在终结方法之中,则不会如此,甚至连警告都不会打印出来 。 清除方法没有这个问题,因为使用清除方法的一个类库在控制它的线程 。

        使用终结方法和清除方法有一个非常严重的性能损失 。 在我的机器上,创建一个简单的 AutoCloseable 对象,用 try-with-resources 将它关闭,再让垃圾回收器将它回收,完成这些工作花费的时间大约为 12ns 。 增加一个终结方法使时间增加到了 550ns 。 换句话说,用终结方法创建和销毁对象慢了大约 50 倍 。 这主要是因为终结方法阻止了有效的垃圾回收 。 如果用清除方法来清除类的所有实例 ,它的速度 比终结方法会稍微快一些(在我的机器上大约是每个实例花 500ns ),但如果只是把清除方法作为一道安全网( safety net ),下面将会介绍,那么清除方法的速度还会更快一些 。 在这种情况下,创建、清除和销毁对象,在我的机器上花了大约 66ns ,这意味着,如果没有使用它,为了确保安全网多花了 5 倍(而不是 50 倍)的代价 。

        终结方法有一个严重的安全问题: 它们为终结方法攻击( finalizer attack ) 打开了类的大门 。 终结方法攻击背后的思想很简单:如果从构造器或者它的序列化对等体( readObject和 readResolve 方法)抛出异常,恶意子类的终结方法就可以在构造了 一部分的应该已经半途夭折的对象上运行 。 这个终结方法会将对该对象的引用记录在一个静态域中,阻止它被垃圾回收 。 一旦记录到异常的对象,就可以轻松地在这个对象上调用任何原本永远不允许在这里出现的方法 。 从构造器抛出的异常,应该足以防止对象继续存在;有了终结方法的存在,这一点就做不到了 。 这种攻击可能造成致命的后果 。final类不会受到终结方法攻击,因为没有人能够编写出 final 类的恶意子类 。为了防止非 final 类受到终结方法攻击 , 要编写一个空的 final 的 finalize 方法 。

        那么,如果类的对象中封装的资源(例如文件或者线程)确实需要终止,应该怎么做才能不用编写终结方法或者清除方法呢?只需 让类实现 AutoCloseable,并要求其客户端在每个实例不再需要的时候调用 close 方法,一般是利用 try - with - resources 确保终止,即使遇到异常也是如此 。 值得提及的一个细节是,该实例必须记录下自己是否已经被关闭了:close 方法必须在一个私有域中记录下“该对象已经不再有效” 。 如果这些方法是在对象已经终止之后被调用,其他的方法就必须检查这个域,并抛出IllegalStateException 异常 。

        那么终结方法和清除方法有什么好处呢?它们有两种合法用途 。 第一种用途是,当资源的所有者忘记调用它的 close 方法时,终结方法或者清除方法可以充当样做井不能保证终结方法或者清除方法会被及时地运行,但是在客户端无法正常结束操作的情况下,迟一点释放资源总比永远不释放要好 。 如果考虑编写这样的安全网终结方法,就要认真考虑清楚,这种保护是否值得付出这样的代价 。 有些 Java 类(如 FileinputStream 、FileOutputStream 、ThreadPoolExecutor 和 java.sql.Connection )都具有能充当安全网的终结方法 。

        清除方法的使用有一定的技巧 。 下面以一个简单的 Room 类为例 。 假设房间在收回之前必须进行清除 。Room 类实现了 AutoCloseable ;它利用清除方法自动清除安全网的过程只不过是一个实现细节 。 与终结方法不同的是,清除方法不会污染类的公有 API:

        内嵌的静态类 State 保存清除方法清除房 间所需的资源 。 在这个例子中,就是 num-JunkPiles 域,表示房间的杂乱度 。 更现实地说,它可以 是 final 的 long,包含一个指向本地对等体的指针。State 实现了 Runnable 接口,它的 run 方法最多被 Cleanable调用一次 ,后者是我们在 Room 构造器中用清除器注册 State 实例时获得的 。 以下两种情况之一会触发 run 方法的调用:通常是通过调用 Room 的 close 方法触发的,后者又调用了 Cleanable 的清除方法 。 如 果到了 Room 实例应该被垃圾 回收时,客户端还没有调用close 方法,清除方法就会(希望如此 )调用 State 的 run 方法 。

        关键是 State 实例没有引用它的 Room 实例 。 如果它引用了,会造成循环,阻止 Room实例被垃圾回收 (以及防止被自动清除) 。因此 State 必须是一个静态的嵌套类,因为非静态的嵌套类包含了对其外围实例的引用 。 同样地,也不建议使用 lambda,因为它们很容易捕捉到对外围对象的引用 。

        如前所述, Room 的清除方法只用作安全网 。 如果客户端将所有的 Room 实例化都包在try-with-resource 块中 ,将永远不会请求到自动清除 。 用下面这个表现良好的客户端代码示范一下:

public class Adult {
    public static void main(String[] args) {
        try (Room myRoom = new Room(7)) {
            System.out.println("Goodbye");
        }
    }
}

        正如所期待的一样,运行 Adult 程序会打印出 Goodbye ,接着是 Cleaning room 。但是下面这个表现糟糕的程序又如何呢 ? 哪一个将永远不会清除它的房间?

public class Teenager {
    public static void main(String[] args) {
        new Room(99);
        System. out.print1n("Peace out");
    }
}

        你可能期望打印出 Peaceout ,然后是 Cleaning room ,但是在我 的机器 上,它没有打印出 Cleaning room ,就退出程序了 。 这就是我们之前提到过的不可预见性 。Cleaner 规范指出:“清除方法在 System.exit 期间的行为是与实现相关的 。 不确保清除动作是否会被调用 。 ”虽然规范没有指明,其实对于正常的程序退出也是如此 。 在我的机器上,只要在 Teenager 的 main 方法上添加代码行 System.gc(),就足以让它在退出之前打印出 Cleaning room ,但是不能保证在你的机器上也能看到相同的行为 。

        总而言之,除非是作为安全网,或者是为了终止非关键的本地资源,否则请不要使用清除方法,对于在 Java 9 之前的发行版本,则尽量不要使用终结方法 。 若使用了终结方法或者清除方法,则要注意它的不确定性和性能后果 。

VHDL实战:基于EDA的数字频率计(FREQ)设计与优化 本文详细介绍了使用VHDL语言和EDA工具设计并优化数字频率计(FREQ)的全过程。从核心原理与模块划分入手,深入讲解了时钟分频、测频控制、计数锁存及显示驱动等关键模块的VHDL实现,并提供了从代码编写、功能仿真到综合布局布线的完整EDA实战指南。文章还探讨了测量精度优化、资源权衡及跨时钟域处理等进阶话题,是掌握FPGA数字系统设计的经典案例。 阅读详情

相关推荐

保姆级教程:用Python仿真OFDM系统(附抗多径干扰优化方案)

本文提供了一份详细的Python仿真OFDM通信系统教程。通过NumPy和Matplotlib,从二进制比特流开始,逐步构建完整的OFDM系统模型,涵盖IFFT、循环前缀等核心概念。重点探讨了如何对抗多径干扰,并提供了优化方案,通过误码率曲线直观对比性能,适合通信工程学习和物理层开发实践。

weixin_29230649的博客 232

《Effective Java》漫谈:被废弃的终结方法

翻开Object源码,其中定义了空方法finalize(),我们看一下文档中的解释当垃圾回收器确定不再有对对象的引用时,由对象上的垃圾回收器调用。子类重写finalize方法以释放系统资源或执行其他清理。finalize方法可以执行任何操作,包括使该对象再次对其他线程可用;然而,finalize的通常目的是在对象被不可撤消地丢弃之前执行清理操作。例如,表示输入/输出连接的对象的finalize方法可能会执行显式的I/O事务,以在永久丢弃该对象之前中断连接。创建一个。

neOO0的博客 311

[亚信线上教学] AX58100: EtherCAT从站设备仿真功能设计教学

什么情况需要开启EtherCAT从站设备仿真功能呢? 一般来说, 当EtherCAT从站产品,不需要使用额外的微控制器介入,或使用不具备EtherCAT从站通讯协议栈的微控制器一同协作的情况下,就必须开启EtherCAT从站设备仿真功能,这样EtherCAT主站才能够正常设置从站设备的工作状态. 亚信AX58100 EtherCAT从站控制芯片的优点 AX58100 EtherCAT从站控制器, 集成2个百兆以太网Phis, 并支持一些额外的控制接口, 例如脉冲宽度调变, 增量, 霍尔编码器, .

allanchou1的专栏 7423

Effective java 笔记 ---- 第八条 避免使用终结方法和清除方法

1. 终结方法(finalizer) 通常是不可预测的,也是很危险的,一般情况下是不必要的。使用终结方法会导致行为不稳定、性能降低,以及可移植性问题。当然,终结方法也有其可用之处,但根据经验,应该避免使用终结方法。在Java9 中用清除方法(cleaner) 代替了终结方法。清除方法没有终结方法那么危险,但仍然是不可预测、运行缓慢,一般情况下也是不必要的。 2. 终结方法和清除方法的缺点在于不能...

huanhuan8944172的专栏 870

【科研绘图】【数据拟合曲线】:附Origin详细画图流程

拟合曲线图

weixin_50236590的博客 4万+

大模型抽取知识图谱三元组的可行性分析

通过结合传统信息抽取模型与大语言模型的混合架构,可高效完成从学术文献到知识图谱三元组的全流程构建。分阶段优化:传统模型负责粗粒度抽取,大模型负责细粒度修正。灵活提示设计:通过少样本学习引导大模型理解领域本体。严格质量控制:结合规则引擎和人工校验,确保三元组准确性。该方案可显著提升知识图谱构建效率,适用于学术研究、企业知识库等场景。

qq_20647053的博客 1066

Effective Java 避免使用终结方法和清除方法 学习记录:

因为清除方法通常需要显式调用,如果开发人员在使用对象之后忘记手动调用清除方法,就会导致资源泄漏。而且,如果在对象使用期间发生异常,清除方法可能不会被调用,导致资源没有被正确释放。首先,由于不确定性,我们无法确定终结方法在何时被调用,这可能导致对象持续存在于内存中,影响性能和资源的分配。总之,避免使用终结方法和清除方法是一个良好的实践,它可以避免不确定性、资源泄漏和性能问题。终结方法和清除方法是Java中的一种机制,在对象被垃圾回收器销毁之前,它们会在对象销毁前被调用。方法,可以在资源不再需要时自动调用。

weixin_36639192的博客 421

LoRa物联网实战:用新大陆模块打造智能LED呼吸灯(附完整代码解析)

本文详细介绍了如何利用新大陆LoRa模块实现工业级智能LED呼吸灯的设计与开发。通过256级PWM调制的呼吸灯效果,结合LoRa无线控制技术,实现设备状态的可视化反馈和多设备同步控制。文章包含完整的硬件选型、电路设计、算法优化和代码实现,特别适合物联网开发者和硬件工程师参考。

github5actions的博客 86

【第8条】避免使用终结方法和清除方法

避免使用终结方法和清除方法 最终方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的。它们的使用会导致不稳定的行为,糟糕的性能和移植性问题。Finalizer机制有一些特殊的用途,我们稍后会在这个条目中介绍,但是通常应该避免它们。从Java 9开始,Finalizer机制已被弃用,但仍被Java类库所使用。Java 9中Cleaner机制代替了Finalizer机制。清除方法没有终结方法那么危险,但仍然是不可预测、运行缓慢,一般情况下也是不必要的 ...

kaituozhe_sh的博客 339

【QT/C++】事件过滤器之基于重写 eventFilter 方法的多种常见应用场景及实现

Qt事件过滤器通过重写eventFilter方法实现多种实用功能:1)鼠标事件处理(点击全选文本、禁用滚轮、悬停提示);2)键盘事件处理(输入内容限制、快捷键提交);3)焦点事件处理(自动弹出下拉框、实时验证);4)绘图事件处理(自定义控件绘制);5)窗口事件处理(防止意外关闭、尺寸限制)。事件过滤器提供非侵入式的事件处理方案,相比传统子类化方式更灵活,通过installEventFilter安装到目标控件即可实现各种交互增强功能。

yuhuasheng1997的博客 1484

YOLOv8/v9 遥感图像目标检测实战指南:建筑物检测与变化监测

遥感图像在城市规划、灾害评估、农业监管等领域应用广泛,但传统目标检测方法存在效率低、精度不足、难以适配遥感图像大尺寸、多尺度目标等问题。本文以“建筑物检测与变化监测”为核心,基于DOTA、NWPU VHR-10等公开数据集,系统讲解YOLOv8/v9在遥感图像中的实战流程。从数据获取、格式转换、模型训练优化,到大图切片推理、建筑物变化监测,全程提供可复现的代码与参数配置。通过针对性优化(旋转增强、切片推理等),模型在NWPU VHR-10数据集上mAP50达0.85以上,可适配卫星影像、无人机航拍等多场景

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 520

【Java笔记(54)】EffectiveJava第八条之避免使用终结方法和消除方法

文章目录1、总结2、终结方法简介 1、总结 只有当终结方法或清除方法作为安全网,或终止非关键性的本地资源时,才考虑使用,一般不用。 永远不应该依赖终结方法或清除方法来更新重要的持久状态。比如关闭数据库。 Java语言规范并没有保证终结方法一定会被运行。 使用终结方法有一个非常严重的性能损失 2、终结方法简介 java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。 对象不一定会被回收。 垃圾回收不是析构函数。 垃圾回收只与内存有关。 垃圾回收和finalize

weixin_43493559的博客 330

YOLOv26详解 | 一文带你从代码角度深入理解ultralytics最新作品yolov26的创新 | 训练、推理、验证、导出 (附网络结构图PPT可用,全网最全)

YOLOv26带来多项创新:1)采用双检测头机制(One-to-Many和One-to-One)实现端到端无NMS推理;2)移除DFL简化边界框回归;3)引入ProgLoss+STAL优化小目标检测;4)使用MuSGD优化器提升训练稳定性。网络结构方面,SPPF模块增加shortcut连接,并在C3k2中引入PSABlock注意力机制。该版本更注重实际部署,简化了推理流程,提升硬件兼容性。教程涵盖模型训练、验证、推理及导出全流程,支持多种格式转换如ONNX、TensorRT等,适合工业应用场景。

Snu77的博客 4067

《Effective Java》第8条:避免使用终结方法和清除方法

它能确保资源在使用完毕后被自动释放,无需手动调用 close() 方法,从而简化代码并避免资源泄漏,但需要关闭的对象必须实现 AutoCloseable 接口,只有实现了 java.lang.AutoCloseable 接口(或其子接口 java.io.Closeable)的对象,才能作为资源在 try-with-resources 中使用。终结方法finalizer()并不是在对象不用之后就会立即执行的,它的执行是任意长时间的,甚至可能不执行,而且在不同的JVM中运行,其结果也会大相径庭。

TD_FAlmK的博客 737

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

避免使用终结方法和清除方法(《Effective Java》第二章第八条)

对于 《Effective Java》第二章第八条:避免使用终结方法和清除方法 进行学习与总结

qq_47129343的博客 744

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Effective Java(Third Edition) item8:避免使用终结方法(finalizer)和清除方法(cleaner)

注:Java9之前只有终结方法,Java9出现了新的清除方法取代了终结方法。 终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的。清除方法没有终结方法那么危险,但仍然是不可预测、运行缓慢,一般情况下也是不必要的。 talk is cheap,show me the code。 定义一个Room类,实现AutoCloseable接口(使用try-with-res...

Talk is cheap,show me the code. 874

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Effective Java3 Item8:避免使用终结器(finalizers)和清除器(cleaners)(内容及笔记)

终结器是不可预测的,通常是危险的,也是不必要的。 它们的使用可能导致不稳定的行为、糟糕的性能和可移植性问题。终结器有一些有效的用途,我们将在后面的文章中介绍,但是作为规则,你应该避免使用它们。在 Java 9 中,终结器已经被弃用,但是 Java 库仍然在使用它们。Java 9 替代终结器的是清除器。清除器的危险比终结器小,但仍然不可预测、缓慢,而且通常是不必要的。 c++ 程序员被告诫不要把终结...

bulibuqiqin的博客 423

Java:Effective java学习笔记之 避免使用终结方法

Java避免使用终结方法避免使用终结方法1、finalize()基本概念2、finalize()的执行过程3、为什么要避免覆盖并使用finalize方法?4、如果类中的资源确实需要被释放,我们应该怎么做?5、终结方法的利弊5.1、终结方法的好处5.2、终结方法的弊端6、总结参考 避免使用终结方法 1、finalize()基本概念 学习过C++的同学看到终结方法(finalizer)应该马上就能想到C++中的析构函数(destructor)。Java中的终结方法果然和C++中的析构函数类似,会在对象被垃圾回收

JMW1407的博客 409

Effective Java 避免使用终结方法和清空方法

终结方法是不可预测的,通常很危险,一般情况下是不必要的(Finalizers are unpredictable, often dangerous, and generally unnecessary.)。使用 终结方法会导致行为不稳定,降低性能,以及可移植性问题。当然,终结方法也有可用之处,我们将在本项的最后再做介绍;但是,作为一项规则,我们应该避免使用它们。在Java 9 中,终结方法已经过时了,但是在Java库中还在使用。Java 9中替代终结方法的方式是清理方法。清理方法比终结方法危险性更低,但仍然

菜园子丶For丨丶Tomorrow的博客 311

笔记《Effective Java》01: 创建和销毁对象

《Effective Java》这本书可以说是程序员必读的书籍之一。这本书讲述了一些优雅的,高效的编程技巧。对一些方法或API的调用有独到的见解,还是值得一看的。刚好最近重拾这本书,看的是第三版,顺手整理了一下笔记,用于自己归纳总结使用。建议多读一下原文。今天整理第一章节:创建和销毁对象。

有一只柴犬的专栏 1852

跟我学(Effective Java 2)第7条:避免使用终结方法

第7条:避免使用终结方法 终结方法(finalize)通常是不可预测的,也是很危险的,一般情况下也是不必要的。使用终结方法会导致行为不稳定、降低性能,以及可移植性的问题。虽然终结方法也有可用之处,但是还是应该避免使用它。 终结方法的坏处: 及时的执行终结方法正是垃圾回收算法的主要功能,不同的JVM在执行终结方法的时候的表现大相径庭,如果程序依赖于终结方法被执行的时间点,那么这个程序的行为在不同的J...

Dullon_jiang的博客 278

《Effective Java》解读第8条:避免使用终结方法和清除方法

摘要:应避免使用终结方法(Finalizer)和清除方法(Cleaner),因其存在不可靠、性能差等缺陷。终结方法可能导致资源未及时释放或异常被忽略;清除方法虽稍好但仍不可预测。正确做法是实现AutoCloseable接口,通过try-with-resources确保资源及时关闭。Java的垃圾回收机制以内存管理为主,不应依赖其处理关键资源释放。

Cosmoshhhyyy的博客 282

Effective Java -- 避免使用finalize方法

此系列文章为本人对《Effective Java》一书的学习笔记,主要是记录对书中重点内容的理解。既然有缘看到此文,那么希望能对你有所帮助。本文对应原书 第8条 避免使用终结方法和清除方法

心之所往 码之所向 568

Effective Java 2nd笔记第二章第五条:避免使用终结方法

参考了《Java编程思想》P87、《深入理解Java虚拟机》关于垃圾回收器的内容1、终结方法和垃圾回收器(GC,Garbage Collector)1.1、垃圾回收器的意义  对于OOP程序员来说,注意初始化的重要性比较容易,但他们常常会忘记重要的清理工作。所谓清理,也就是回收一个对象所占用的资源(内存资源和非内存资源)。而一旦程序员忘记清理—比如把一个对象用完后就“弃之不顾”,这可能就会导致“内存

DawnCloudM的博客 466

java 终结方法_第02章:创建和销毁对象/第8项:避免使用终结方法和清理方法.md · lin-mt/effective-java-third-edition - Gitee.com...

避免使用终结方法和清理方法(Avoid finalizers and cleaners)终结方法是不可预测的,通常很危险,一般情况下是不必要的(Finalizers are unpredictable, often dangerous, and generally unnecessary.)。使用终结方法会导致行为不稳定,降低性能,以及可移植性问题。当然,终结方法也有可用之处,我们将在本项的最后再...

weixin_32635501的博客 193

【总结】Effective java经验之谈,创建和销毁对象

关于Effective java 这本书,自己的一些总结性的思考。篇幅可能不按照目录来,因为自己喜欢先看哪一章就直接阅读了。不过能确定的是,每一章都会有总结。欢迎大家拍砖与补充。

阿利在努力 2302
上一篇: Effective Java笔记(7)消除过期的对象引用
下一篇: Effective Java笔记(9)try-with-resources 优先于 try -finally
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值