这三个其实吊关系都没有

final 用来说明对象是不可变的,是无法被继承的

finally是保证代码必须要执行的一种机制,可以用来关闭资源等操作

finalize 是java.lang.Object的一种方法,是为了保证资源再被回收之前有一些额外的操作,但是在Jdk9之后已经被标记为Deprecated

final虽然说可以进行所谓的方法内联,改善JVM编译能力,但是呢,JVM相对来说是很智能,final字段对于性能的影响并不是很大,所以final主要的目的还是为了说明其语义,即改常量是不可变的

而且final和immutable是不一样的

final说明这个对象是不可以变的,但是对于对象内部的操作,是无法限制

如果需要所谓的不可以变性,需要

将class自身生命为final

并且将所有内部成员变量设置为final或者private

而且对于get的方法,做到copyonwrite

对于构造器,使用深拷贝做到和传参彻底的解耦

finally则是一个标准的语法,这个语法中常见的使用是对于关闭连接资源的操作,而且有try-with-resources语法糖,所以没有什么出格的问题

图片

对于上面的代码可能是一个特例

从字节码的角度,直接跳出执行了

对于finalize,这是业界不推荐使用,而且在Java9中,也被标记为了废气,所以不建议使用进行资源回收,其主要原因是不知道什么时候finalize会执行,执行会不会导致思索

而且会导致拖慢垃圾回收,导致性能下降了40-50倍

而且finalize还会掩盖资源回收是的出错信息

图片

那么有什么机制可以替换finalize吗

Java现在在推荐的是Cleaner机制来替换原有的finalize实现,实现了幻想引用,可以在这个机制里做一些资源回收的操作

而且有着自己的运行线程,避免了意外的死锁

发表评论

邮箱地址不会被公开。 必填项已用*标注