Java核心技术36讲 第三讲:final、finally、finalize的不同

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jal517486222/article/details/82807093

final、finally、finalize

  1. final可以用来修饰类、方法、变量,分别有不同的意义, final修饰的class不可以继承扩展,final的变量不可以被修改,final的方法不可以重写(override)
    final不是immutable(不可变)
    Immutable在很多场合是非常棒的选择,然而Java预压目前并没有原生的不可变支持,如果要实现immutable类,我们可以做到:

    • 将class自身申明为final,这样别人就不嗯能够扩展来绕过限制了。
    • 将所有成员变量定义为private和final,并且不要实现setter方法。
    • 通常构造对象时,成员变量使用深度拷贝来初始化,而不是直接赋值,这是一种预防措施,因为你无法确定输入对象不被其他人修改。
    • 如果确实需要实现getter方法,或者其他可能会返回内部状态的方法,使用copy-on-write原则,创建私有的copy。
  2. finally是Java保证重点代码一定要被执行的一种机制。我们可以使用try-finally或者try-catch-finally来进行类似关闭JDBC连接、保证unlock所等动作。

列几个finally不会被执行的情况:

  • try-catch异常退出。
try{
    System.exit(1);
}finally{
    print("hello");
}
  • 无限循环:
try{
    while(true){
        print("hi");
    }
}finally{
    print("hello");
}
  • 线程被杀死:
    当执行try,finally的县城北杀死时,finally也无法执行。

不要在finally中使用return语句。finally重视执行,除非程序或者线程被中断。

  1. finalize是进出类java.lang.Object的一个方法,它的设计目的是保证对象在垃圾收集前完成特定资源的回收。finalize机制现在已经不推荐使用,并且在JDK 9中开始被标记为deprecated。
    因为无法保证finalize什么时候执行,执行的是否符合预期。使用不当会影响性能,导致程序死锁、挂起等。
    finalize的执行时和垃圾收集关联在一起的,一旦实现了非空的finalize方法,就会导致相应对象回收呈现数量级(40-50)上的变慢。
    finalize被设计成在对象被垃圾收集前调用,这就意味着实现了finalize方法的对象是个“特殊公民”,JVM要对他进行额外处理。finalize本质上成了快速回收的阻碍者,可能导致你的对象经过多个垃圾收集周期才能被回收。
    finalize拖慢垃圾收集,导致大量对象堆积,也是一种典型的导致OOM的原因。
    java.lang.ref.Cleaner可以替换原有的finalize实现,其利用了幻想引用。

猜你喜欢

转载自blog.csdn.net/jal517486222/article/details/82807093