美文网首页
final、finally、finalize有什么不同?

final、finally、finalize有什么不同?

作者: erki_stwee | 来源:发表于2018-05-12 00:54 被阅读23次

    基本知识

    final可以用来修饰类,方法,变量,分别有不同的意义。final修饰类表示不可以继承扩展;final的变量是不可以修改的;final修饰的方法也是不可以重写的。

    finally则是Java保证重点代码一定要被执行的一种机制。我们可以使用try-finally或者try-catch-finally来进行类似关闭JDBC连接、保证unlock锁等操作。

    finalize是基础类Java.lang.Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特资源的回收。(现在已经不推荐使用,可能会引发OOM

    实践场景

    • 我们可以将方法申明为final,这样可以明确告知别人,这些行为是不允许修改的。
    • 使用final修饰参数或者变量,也可以清楚的避免意外赋值到导致的编程错误,甚至有人明确推荐奖所有方法参数、本地变量、成员变量声明成final。
    • final变量产生了某种程度的不可变的效果,可以用于保护只读数据,尤其是在并发编程中,因为明确地不能在赋值final变量,有利于减少额外的同步开销,也可以省去一些防御性拷贝的必要。

    finally知道怎么使用就足够了。在Java7之后更加推荐try-with-resources语句。

     public static void main(String [] args){
            try(A a = new A();C c = new C()){
                a.say();
                c.say();
            } catch (Exception e) {
                System.out.println(e.getSuppressed().toString());
            } finally{
                System.out.println("finally");
            }
        }
    
    输出结果
    I am A
    I am C
    C is CLOSED in the close.
    A is CLOSED in the close.
    java.lang.Exception: Exception A
    finally
    

    对于finalize,我们要明确它是不推荐使用的。

    知识扩展

    final不是immutable(不可变)
    如果非要实现immutable的类

    • 将class声明为final,这样别人不能通过扩展来绕过限制了
    • 将所有成员变量设置为private和final,并且不要实现set方法。
    • 采用深度拷贝来初始化值。

    匿名内部类访问局部变量的时候为什么要采用final来修饰??? Java内部类会copy一份局部变量,而不是直接去使用局部变量,final可以防止出现数据一致性的问题。

    **
    Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。
    CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。它只能保证最终一致性,不能保证实时一致性。**

    相关文章

      网友评论

          本文标题:final、finally、finalize有什么不同?

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