天天看点

final 、finally、finalize有什么区别

final 是可以用来修饰类、方法、变量、分别不同的意义。 

final 修饰的类class代表不可以继承

final 修饰的变量表示不可修改

final 修饰的方法表示不可重写(override)

finall 是java中保证代码一定要被执行的一种机制,我们可以使用 try-finally 或者 try-catch-finally 来进行类似关闭jdbc,unlock 锁等动作。

finalize 是基础类 java.lang.object 的一个方法,他的设计目的是保证对象在垃圾收集前完成特定资源的回收。finalize机制不推荐使用。jdk9 被标记为 deprecated。

final使用有什么好处?

final 变量产生了某种程序的不可变效果,可以用来保护只读数据。尤其在并发编程中,可以明确地不能赋值 final 变量,有利于减少额外的同步开销。

这个比较特殊 上面 finally 里面的代码不会被执行。

如何实现一个不可变类

将class 本身声明为 final ,这样就不能被继承扩展

将所有成员变量定义为 private 和 final ,并且不要实现 setter

通常构造对象是,成员变量使用深度拷贝来初始化,而不是直接赋值。因为你无法确定输入对象不被其他人修改。

如果确实需要实现getter 方法。获知其他可能返回内部状态的方法,使用 copy-on-write (写时复制)原则。java 有 copyonwritearraylist 实现

栗子:

为啥说不推荐使用  finalize?

java 平台正在使用 java.lang.cleaner 类替换 finalize 实现 ,cleaner 的实现使用 虚引用(phantomrefrence),这个是一种常见的所谓 post-mortem 清理机制。

主要原因是 finalize 会掩盖资源回收时的出错信息 看 java.lang.ref.finalizer 源码

throwable 生吞了一切已成,及时出现异常或者出错,也得不到任何有效信息。

jdk9 平台使用了 clearner 来替换原来的 finalize 实现

cleaner 采用 虚引用技术,但是我们平时还是尽量不怎么用,这个只是最后的保障。并不能完全依赖 cleaner做内存回收。

https://mp.weixin.qq.com/s/xgjd9vao3s3jdi1bn5gxsw