美文网首页
提示八-九

提示八-九

作者: 飞絮搅青冥 | 来源:发表于2022-05-13 23:05 被阅读0次

    今天看第八条和第九条:

    第8条:避免使用终结方法和清理器。

    对于这一条,我感触其实不深,因为平时写代码几乎不会用到这两种机制,看了下我们项目中好像确实也没有人使用过,所以就简单摘录一下作者的观点,学习一波。

    • 终结方法(finalizer)通常是不可预测的,也是很危险的,一般情况下是不必要的。使用终结方法会导致行为不稳定,降低性能,以及可移植性问题。
    • 终结方法并不一定会被及时的执行,从一个对象变得不可到达开始,,到它的终结方法被执行,,所花费的时间是任意长的。JVM会延迟执行终结方法。
    • Java语言规范不能保证终结方法会被执行,不应该依赖终结方法来更新重要的持久状态。
    • System.gc()System.runFinalization()方法增加了终结方法被执行的机会,但是它们并不保证终结方法一定会被执行。
    • 使用终结方法或者清洁器机制会导致严重的性能损失。
    • 为对象封装需要结束的资源,让类实现 AutoCloseable 接口即可,并要求客户在在不再需要时调用每个实例 close 方法,通常使用 try-with-resources 确保终止。
    • 除了作为一个安全网或者终止非关键的本地资源,不要使用 Cleaner 机制,或者是在 Java 9发布之前的 finalizers 机制。

    第九条:优先使用try-with-resources而不是try-finally。

    • try-finally最大的问题是当有多个资源需要关闭的时候,嵌套的时候看起来很丑。并且如果try和finally块中都有异常抛出,通常第二个会掩盖了第一个。

    • 使用try-with-resources只需要实现AutoCloseable接口。

    • 当多个异常抛出的时候, 后续异常会被suppressed, 可以通过getSuppressed()

    try-with-resources最初是在Java 7中引入的,其背后的全部想法是,开发人员无需担心仅在一个try-catch-finally块中使用的资源的资源管理。这是通过消除对finally块的需要而实现的,实际上,开发人员仅在关闭资源时才使用块。并且代码通常更清晰易读,因此使代码更易于管理,尤其是当我们处理许多try块时。

    在try语句之后在括号中打开的资源仅在此处和现在需要。.close()在try块中完成工作后,我将立即调用它们的方法。如果在try块中抛出异常,无论如何我都会关闭这些资源。

    从Java 9开始,没有必要在try-with-resources语句中声明资源。但是我们系统使用的还是Java 8,所以还用不了这个新特性,不过我们系统中try-finally已经被广泛运用,不管是需要资源还是做一些可能会存在问题的操作时都有这样用到,我以前也写了好多这样的方法,导致有时候出现错误时并不能从堆栈中找到有用的报错信息,这一点真的一度非常困扰我。以后可以尝试多使用try-with-resources的方式来编写代码。

    相关文章

      网友评论

          本文标题:提示八-九

          本文链接:https://www.haomeiwen.com/subject/upzuurtx.html