简单了解Effective java

来源:互联网 发布:09和冷冷的故事 知乎 编辑:程序博客网 时间:2024/06/10 00:21
Java提供finalize()方法,垃圾回收期准备释放内存的时候,会先调用finalize().
(1).对象不一定会被回收。
(2).垃圾回收不是析构函数.
(3).垃圾回收只与内存有关.
(4)拦击回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的.使用终结方法作为最后用来释放内存的杀手锏显然是不合理的,因为jvm不保证终结方法会被执行.

(5).正常情况下,未被捕获的异常将会使线程终止,并打印出栈轨迹,但是,如果异常发生在终结方法之中,则不会如此,甚至连警告都不会打印出来.当然如果你不希望这个异常被抛出来,可以把它放在终结方法中.

//终结方法显式声明protected void finalize( ){    System.out.println("释放本类占用的资源!!!");}//调用public class FinalizeTest {    public static void main(String[] args) {        Employee e = new Employee(18);        System.out.println(e.getId());        e.finalize();    }}

那么,如果类的对象中封装的资源(例如文件或者线程)确实需要终止,应该怎么做才能不用编写终结方法呢?只需提供一个显式的终止方法,并要求该类的客户端在每个实例不再有用的时候调用这个方法。值得提及的一个细节是,该实例必须记录下自己是否已经被终止了:显式的终止方法必须在一个私有域中记录下“该对象已经不再有效”。如果这些方法是在对象已经终止之后被调用,其他的方法就必须检查这个城,并抛出IllegalstateException异常。显式终止方法的典型例子是Inputstream、outputstream和java.sql.connection上的close方法。另一个例子是jova.util.Timer上的canoel方法,它执行必要的状态改变,使得与Timer实例相关联的该线程温和地终止自己。java.awt中的例子还包括Graphics.dispose和window.dispose。这些方法通常由干性能不好而不被人们关注。一个相关的方法是lmage.flush,它会释放所有与lmage实例相关联的资源,但是该实例仍然处干可用的状态,如果有必要的话,会重新分配资源。显式的终止方法通常与try-6nally结构结合起来使用,以确保及时终止。在finally子句内部调用显式的终止方法,可以保证即使在使用对象的时候有异常抛出,该终止方法也会执行.

那么终结方法的有点呢?在下面两种情况下可以使用终结方法
1.如果忘记调用终止方法(不是终结方法)释放资源,可以临时用终结方法当安全网,但是执行终结方法会花很多时间,需要考虑到底有没有必要执行
2.终结方法的第二种合理用途与对象的本地时等体(nativepeer)有关。本地对等体是一个本地对象(nativeobject),普通对象通过本地方法(nativemethod)委托给一个本地对象。因为本地对等体不是一个普通对象,所以垃圾回收器不会知道它,当它的Java对等体被回收的时候,它不会被回收。在本地对等体并不拥有关键资源的前提下,终结方法正是执行这项任务最合适的工具。如果本地对等体拥有必须被及时终止的资源,那么该类就应该具有一个显式的终止方法,如前所述。终止方法应该完成所有必要的工作以便释放关键的资源。终止方法可以是本地方法,或者它也可以调用本地方法。

什么是本地方法(Native Method)
简单地讲,一个Native Method就是一个Java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。

终结方法守卫者等暂不了解.


初学Effective java,若文章有什么不足之处,还请指正修改,再此写过各位了.








原创粉丝点击