简单了解Effective java
来源:互联网 发布:09和冷冷的故事 知乎 编辑:程序博客网 时间:2024/06/10 00:21
Java提供finalize()方法,垃圾回收期准备释放内存的时候,会先调用finalize().
(1).对象不一定会被回收。
(2).垃圾回收不是析构函数.
(3).垃圾回收只与内存有关.
(4)拦击回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的.使用终结方法作为最后用来释放内存的杀手锏显然是不合理的,因为jvm不保证终结方法会被执行.
那么,如果类的对象中封装的资源(例如文件或者线程)确实需要终止,应该怎么做才能不用编写终结方法呢?只需提供一个显式的终止方法,并要求该类的客户端在每个实例不再有用的时候调用这个方法。值得提及的一个细节是,该实例必须记录下自己是否已经被终止了:显式的终止方法必须在一个私有域中记录下“该对象已经不再有效”。如果这些方法是在对象已经终止之后被调用,其他的方法就必须检查这个城,并抛出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的函数。
(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,若文章有什么不足之处,还请指正修改,再此写过各位了.
阅读全文
1 0
- 简单了解Effective java
- 一分钟简单了解Effective java
- Java RMI简单了解
- Java NIO 简单了解
- 简单了解Java
- Java Enumeration简单了解
- Java NIO 简单了解
- Java NIO 简单了解
- 简单了解java变量
- Java NIO 简单了解
- java一些规矩-effective java 简单笔记
- java.util.Locale简单了解
- 【原】java定时器简单了解
- Java注解的简单了解
- Java注解的简单了解
- Java线程池简单了解
- 对Java的简单了解
- Java多线程同步简单了解
- Java:模运算
- 匿名内部类笔记
- 如何终止java线程
- java.util.Properties类
- 修饰词的用法
- 简单了解Effective java
- 单链表一些总结
- Gym-100820 Racing Gems(二维LIS)
- Alice, Bob, Two Teams CodeForces
- mysql row模式的一些小问题(一)
- 浅拷贝、深拷贝与写时拷贝
- Integer源码(toHexString).md
- 构造代码块笔记
- ActiveMQ实战(三)--ActiveMQ的通信方式之主题发布订阅式(publish-subscribe)