`
href
  • 浏览: 7527 次
  • 性别: Icon_minigender_1
  • 来自: 福建
最近访客 更多访客>>
社区版块
存档分类
最新评论

创建和销毁对象

阅读更多
第1条:考虑用静态工厂方法代替构造函数
好处:
1。静态工厂方法的第一个好处是,与构造函数不同,静态方法具有名字
2.静态工厂方法的第二个好处是与构造函数不同,它们每次被调用的时候,不要求非得创建一个新的对象
3.静态工厂方法的第三个好处是与构造函数不同,它们可以返回一个原返回类型的子类型的对象。这样我们在选择返回对象的类型时就有了更大的灵活性。

缺点
1.静态工厂方法的主要缺点是,类如果不含有公有的或者受保护的构造函数,就不能被子类化。
2.静态工厂方法的第二个缺点是,它们与其他的静态方法没有任何区别。

第2条:使用私有构造函数强化singleton属性

第一种方法
public class Elvis{
  public static final Elvis INSTANCE=new Elvis()
  private Elvis(){}
}
第二中方法
ublic class Elvis{
  private static final Elvis INSTANCE=new Elvis()
  private Elvis(){}
  public static Elvis getInstance(){
     return INSTANCE;
  }
}

第一种方法的主要好处在于组成员的类声明很清楚的表明了这个类是一个singleton:公有的静态域是final的。
第二中方法的主要好处在于,它提供了灵活性;在不改变api的前提下,允许我们改变想法,把该类做成singleton或者不做成singleton。比如说为每个方法的线程返回一个唯一的实例。

第3条:通过私有构造函数强化不可实例化的能力

只包含静态方法和静态域的类(比如工具类Collections),对它进行实例化没有任何意义。
企图通过将一个类做成抽象类来强制该类不可被实例化,这是行不通的。该类可以被子类化,并且该子类也可以被实例化。更一进一步,这样做会误导用户,以为这种类是专门为了继承而设计的。我们只要将这个类包含单个显示的私有构造函数,则它就不可被实例化。
这样习惯用法也有副作用,它使的一个类不能被子类化。所有的构造函数都必须调用一个可访问的超类构造函数,无论显示的或是隐士的,在这种情况下,子类就没有可访问的构造函数来调用了。

第4条:避免创建重复对象
重复使用同一个对象,而不是每次需要的时候就创建一个功能上等价的新对象。如果一个对象是非可变的,那么它总是可以被重用。

不要错误的认为本条目所介绍内容暗示:创建对象的代价是非常昂贵的,我们应该要尽可能得避免创建对象。相反,由于小对象的构造函数只要做少量的工作,所以小对象的创建和回收动作是非常廉价的。特别是在现代的jvm实现更是如此。通过创建附加对象以使得一个程序更加清晰,简洁,功能强大,这往往也是一件好事。
反之,通过维护自己的对象池来避免创建对象的创建工作并不是一个好的做法,除非池种的对象是非常重量级的。一个正确使用对象池的典型例子就是数据库连接。
然而一般而言,维护自己的对象池会把代码弄的很乱,增加内存占用,并且还损害性能,现代的jvm实现有高度优化的垃圾回收器,其性能很容易超过轻量级对象池的性能。

第5条:消除过期的对象引用

第6条:避免使用终结函数
终结函数(finalizer)通常是不可预测的,常常也是很危险的,一般情况下是不要的。使用终结函数会导致不稳定的行为,更差的性能,以及带来移植行问题。
终结函数并不能被及时的执行,从一个对象变的不可到达开始,到它的总结函数被执行,这段时间的长度是任意的,不确定的。这意味着,时间关键的任务不应该由终结函数来完成。
如果一个程序依赖于终结函数被执行的时间点,那么这个程序的行为在不同的jvm中运行的表现可能会截然不同。
不要被system.gc和system.runFinalization这两个方法所诱惑,它们确实能增加终结函数的执行机会,但是不保证终结函数一定会被执行。
那么,如果一个类封装的资源确实需要回收,我们应该怎么办?只需要提供一个显示的终止方法,并要求该类的客户在每个实例不在有用的时候调用这个方法。
一个值得提的细节是,该实例必须记录自己是否已经被终结了:显示的终止方法必须在一个私有域中记录下“该对象已经不在有效了”,其他方法必须检查这个域,如果在该对象已经被终止之后,这些方法调用的话,那么他们应该抛出illegalstateException。
显示终止方法的一个典型例子是InputStream的close方法。
显示的终止方法通常与try finally结合使用,以确保及时终止。

终结函数有什么好处呢?1,当一个对象的所有者忘记调用了显示终止方法的情况,终结函数可以充当安全网,虽然并不能保证被及时调用,InputStream有终结函数。2.普通对象通过本地方法委托给一个本地对象。因为本地对象不是一个普通对象,所以垃圾回收不会知道它,当它的普通对象被回收的时候,本地对象不会被回收,此时就可以派上用场。
终结函数连不会被自动执行,子类改写父类终结函数,那么子类终结函数必须手工调用超类的终结函数。
总之,除非是作为安全网,或者是为了终止非关键的本地资源,否则请不要使用终结函数,即是使用了那么记住调用super.finalize.


分享到:
评论

相关推荐

    Qt6 QML Book/动态QML/创建和销毁对象示例源码

    Qt6 QML Book/动态QML/创建和销毁对象 示例源码 CSDN审核可能较慢,如无法下载,可以过段时间再回来看下 仅供相关爱好者交流使用,请于下载24小时内删除

    C#创建、销毁对象和继承

    内容提要 • 使用构造方法 • 初始化数据 • 对象和内存 • 资源管理 派生类 • 实现方法 • Sealed类 • 使用接口 • 使用抽象类

    JAVA创建和销毁对象的方法

    本篇文章主要介绍了JAVA创建和销毁对象的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    监听器:监听三个对象的创建和销毁方法

    本次工程的目标是学习监听器,掌握监听三个对象的创建和销毁方法。 三个对象:rquest,session,ServletContext 实现的接口:ServletRequestListener,HttpSessionListener,ServletContextListener 工程的大致步骤...

    Java线程池技术详解

    在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一...

    c++多线程的创建挂起执行与销毁

    1. 创建一个基于对话框的应用程序。并增加如图所示控件;分别为3个进度条控件关联...//销毁线程句柄 } else { MessageBox("终止进程失败!"); } 11. 为应用程序添加WM_TIMER消息,实时更新全局变量的值到编辑框;

    C++ 编程思想(PDF)

    1.7 创建和销毁对象 11 1.8 异常处理:应对错误 12 1.9 分析和设计 12 1.9.1 第0阶段:制定计划 14 1.9.1.1 任务陈述 14 1.9.2 第1阶段:我们在做什么 14 1.9.3 第2阶段:我们将如何建立对象 16 1.9.3.1 对象...

    C++动态内存分配(new/new[]和delete/delete[])详解

    为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变分配内存的大小,calloc:指针指向内存前初始化),这些...

    ACE对象生命周期管理者:一种用于控制对象创建和销毁的补充模式

    目的对象生命周期管理者模式可以被用来控制对象的整个生命周期,从对象被首次使用前创建它们到应用程序中止前完全的销毁它们。此外通过在应用启动/中止时进行对象自动的预先创建/销毁,使这个模式能够用来替代静态...

    监听session的创建到销毁

    这是一个用springMVC的项目 是一个监听器 用于监听session的创建、销毁、移除。会触发相应的事件处理

    从使用到原理学习Java线程池

    在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个...

    用Python实现一个简单的线程池

    在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是 如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一...

    java高效编程指南

    JAVA高效编程指南 1 创建和销毁对象 2 对象定义 3 类和接口 4 结构的替代

    课堂笔记_c++应用1

    1.3 线程池面向对象编程中,创建和销毁对象是很费时的,因为创建一个对象要获取内存资源或者其它更多资源 2.2 IO复用机制2.2.1 select#inclu

    ThreadPool:Java 线程池的使用 例子

    线程池的技术背景在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高...

    java教学笔记之对象的创建与销毁

    面向对象的编程语言使程序能够直观的反应客观世界的本来面目,并且使软件开发人员能够运用人类认识事物所采用的一般思维方法进行软件开发,是当今计算机领域中软件开发和应用的主流技术。

    java逻辑思维笔试题-effective-java-3rd-edition:有效的Java第3版注释

    创建和销毁对象 03 - 所有对象通用的方法 04 - 类和接口 05 - 泛型 06 - 枚举和注释 07 - Lambda 和流 08 - 方法 09 - 通用编程 10 - 例外 11 - 并发 12 - 序列化 第 2 章 - 创建和销毁对象 第 1 项 - 考虑静态工厂...

    Effective Java第三版1

    《Effective Java》第三版中文版目录 第一章 介绍 1 第二章 创建和销毁对象 4 1 考虑用静态工厂方法替换构造器 4 2 当遇到多个构造器参

Global site tag (gtag.js) - Google Analytics