Effective Java 6-7

本文探讨了在Java中避免使用终结函数的原因及其带来的问题,包括不可预测性、性能影响及移植性难题。同时,文章还介绍了正确重写equals方法的通用约定,确保其遵循自反性、对称性、传递性和一致性原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

六,避免使用终结(finalizer)函数
原因:终结函数通常是不可预测的,一般情况下不要使用,使用的结果会带来很多问题,不稳定,性能差,移植问题等等。
分析原因:
1,从一个对象不可到达到它的终结函数被执行,这段时间是任意的,不确定的,所以时间关键的系统不应该使用终结函数。
2,及时的执行终结函数是垃圾回收算法决定的,这种算法在不同的JVM实现中会大相径庭,使用终结函数的结果就是导致移植性问题
3,如果执行终结函数的线程一直低于当前的线程的优先级,很可能造成占用大量内存,极端情况是出现OutOfMemoryError
4,JSL不保证终结函数一定被执行,所以不要依赖终结函数来更新关键性的永久状态,例如数据库的永久锁
5,不要相信System.gc()    System.runFinalization这两个函数,它们只能提高终结函数的执行机会,并不保证一定执行。唯一保证一定执行的是System.runFinalizersOnExit喝Runtime.runFinalizersONExit()但这两个方法已经被声明不建议使用.
6,一个在终结函数中的一场不会打出任何信息
七:在改写equals方法的时候遵守通用约定
分析:
1,有些情况下不要随意改写equals
(1),一个类的每个实例本质上是唯一的,例如Thread
(2),不管新一个类是否提供了“逻辑相等”的测试功能,例如java.util.Random
(3),超类已经改写了equals,从超类继承过来的行为对于子类也是适合的 例如Set从AbstractSet继承了equals
(4),一个类是私有的,或者是包级私有的,并且确定它的equals方法永远不会被调用
2, 通用的约定
自反性:  对于任意的引用值x ,x.equals(x)一定为true
对称性:  对于任意的引用值x,y  x.equals(y)返回true是 y.equals(x)也一定返回true
传递性:对于任意的引用值x,y,z  如果x.equals(y)返回true 并且y.equals(z)返回true 那么 x.equals(z)也一定是true
一致性:对于任意的x,y如果x,y没有被更改,调用任意多次x.equals(y)返回的结果应该一样。
非空性:对任意的引用x ,x.equals(null)一定返回false
3不要将equals声明中的Object对象换成别的类型
4,不要让equals方法依赖不可靠资源


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值