Java:final/finally/finalize

finial

修饰对象

用于修饰类,方法,成员变量

修饰类的时候类不能被继承

修饰方法的时候方法不能被重写

修饰成员变量的时候变量只能赋值一次,不可以被修改

不可变类需要final

不可变类需要finial修饰方法和成员变量,类似于String

为什么要有不可变类?

一种说法是不可变类性能要比可变类好

二不可变类在多线程时能保证程序的安全性,省去防御性拷贝

final修饰的不一定是不可变类

final修引用类型数据时只能保证引用地址不变,可引用对象的行为final无法控制

所以要达到不可变需要对象本身不可变

创建不可变类

将class自身声明成为final,这样别人就不能扩展来绕开限制

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

通常构造对象时,成员变量使用深度拷贝来初始化,而不是直接赋值,这是一种防御性措施,因为你无法确定输入对象不被他人修改

如果确实需要实现getter方法,或者其他可能会反回内部状态的方法,使用copy-on-write原则,创建私有copy

finally

使用方式try{}finally{}  try{}catch(){}finally{}

保证java重点代码一定要被执行的一种机制,主要用于释放资源,例如unlock锁

finalize

这个是Object的一个方法,如果复写了这个方法,GC在垃圾回收时会特殊处理,在回收的时候回调用此方法用于资源回收,但不建议使用此方法,为什么?你无法保证finalize什么时候执行,执行的是否符合预期。使用不当会影响性能导致程序死锁,挂起。释放资源使用try-finally足以,也可是使用Cleaner机制

资源用完显示释放,或者利用资源池来尽量重用

Cleaner替换了原有的finalize实现。Cleaner实现利用了幻想引用和引用队列,我们可以保证对象被彻底销毁前做一些类似资源回收的工作,比如关闭文件描述符,他比finalize更加轻量,更可靠

他是运行在自己独立的线程中,可避免意外的死锁等问题

你可能感兴趣的:(Java:final/finally/finalize)