Java核心36讲之final、finally、 finalize的不同

极客时间,杨晓峰老师的课,特别好的课程,学习一下,记一些东西,微信搜索“极客时间”就ok啦

上一篇:Java核心之Exception和Error有什么区别

当然这篇也有在学习的时候记得笔记,记得学习Java基础的时候这个final真是让人头皮发麻,学长小考核的时候也是,需要对这个关键字掌握的比较死,我之前的博客有兴趣看下啦~传送门Java中final、static关键字使用总结

final、finally、 finalize的不同,引用一句网友名言,可能这三个的关系就是卡巴斯基和巴基斯坦的关系,有个基巴关系~感觉只要了解就可以
基础的意义:

  1. final:用来修饰类、方法、变量等用法
  2. finally:Java保证重点代码一定要被执行的一种机制,比如使用try-finally\try-catch-finally来进行类似关闭JDBC连接、保证unlock锁等动作
  3. finalize:设计目的是保证对象在被垃圾回收前完成特定资源的回收。finalize机制现在已经不推荐使用,JDK9中开始被标记为deprecated

1、final

  • 将方法或类声明为final,就可以明确告诉别人,这些行为是不许修改的。例如:java.lang包下面的很多类被定义为final class,在第三方类库中的一些基础类中同样如此,可以有效避免API使用者更改基础功能,是用来保证平台安全的必要手段

  • final修饰参数或变量,清楚避免意外赋值导致的编程错误

  • 保护只读数据。在并发编程中,使用final可有利于减少额外的同步开销,省去一些防御性拷贝的必要

!!!注意:使用final也许会有性能的好处,但是使用时需要去验证。(比如使用final有助于JVM将方法进行内联,从而改善斌一起进行条件编译的能力)

2、finally

这个明白finally是什么,会使用就ok
杨老师举到的一个例子:

try {
  System.exit(1);
} finally{
  System.out.println(“finally”);
}

finally代码块中代码不会执行。

3、finallize

不推荐使用,不能指望它进行资源回收

知识拓展

1、final ≠ immutable(不可变)
如代码所示:

 final List strList = new ArrayList<>();
 strList.add("Hello");
 strList.add("world");  
 List unmodifiableStrList = List.of("hello", "world");
 unmodifiableStrList.add("again");

大家都知道上面代码的前三行使用时可行的,但是我们怎么做到对象本身完全不可变。就像最下面两行代码,List.of创建的本身是不可变的List,所以最后那句add在运行时抛出异常。

若实现完全不可变的类,需要做到:
class声明为final,所有的成员变量声明为“private final”,不要实现setter方法,构造对象时成员变量使用深度拷贝来初始化,不是直接赋值,因为无法确定输入对象不被其他人修改。若确实有需要实现getter方法,或者其他可能返回内部状态的方法,使用copy-on-write原则,创建私有的copy。

2、java.lang.ref.Cleaner替换掉原有的finalize实现。
Cleaner的实现利用了幻象引用,是一种常见的post-mortem清理机制(网友自行去某歌查询),利用幻象引用和引用队列,可以保证对象被彻底销毁前做一些类似资源回收的工作比如关闭文件描述符(操作系统有点的资源),并且Cleaner的操作是独立的,拥有自己的线程,可以避免意外死锁的问题。

public class CleaningExample implements AutoCloseable {
        // A cleaner, preferably one shared within a library
        private static final Cleaner cleaner = ;
        static class State implements Runnable { 
            State(...) {
                // initialize State needed for cleaning action
            }
            public void run() {
                // cleanup action accessing State, executed at most once
            }
        }
        private final State;
        private final Cleaner.Cleanable cleanable
        public CleaningExample() {
            this.state = new State(...);
            this.cleanable = cleaner.register(this, state);
        }
        public void close() {
            cleanable.clean();
        }
    }

你可能感兴趣的:(Java,Java核心36讲)