DANCE WITH JAVA

开发出高质量的系统

常用链接

统计

积分与排名

好友之家

最新评论

Effective Java 6-7

六,避免使用终结(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方法依赖不可靠资源


posted on 2007-01-30 22:09 dreamstone 阅读(699) 评论(1)  编辑  收藏 所属分类: jdk相关

评论

# re: Effective Java 6-7 2007-01-31 09:04 ant

谢谢楼主的分享!
希望这样的专题可以继续下去,期待!  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: