`
href
  • 浏览: 7757 次
  • 性别: 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技术,特别是关注如何动态地创建和销毁对象。QML是Qt框架提供的一种强大的声明式编程语言,它允许我们构建具有丰富用户界面的应用程序。Qt6版本带来了许多改进和新特性,使得QML...

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

    “对象和内存”涉及到C#的垃圾回收机制。当对象不再被引用时,系统会自动回收其占用的内存。然而,对于处理非托管资源(如文件句柄或数据库连接)的对象,应使用`using`语句或实现`IDisposable`接口来确保资源的正确...

    JAVA创建和销毁对象的方法

    在Java编程中,创建和销毁对象是至关重要的操作,它们直接影响到程序的性能和内存管理。本文将深入探讨Java中创建对象的几种方法以及对象的销毁。 首先,我们来看看创建对象的基本方式——构造器。构造器是每个类都...

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

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

    【原】unity 不销毁对象的处理

    "不销毁对象的处理"这个话题涉及到如何在游戏运行过程中保持某些对象的状态,而不是在不再需要时销毁它们,然后在需要时重新创建。这通常用于实现持久化数据、避免频繁的实例化和销毁开销,或者维护一些全局的游戏...

    基于Java的对象池管理系统.zip

    本项目是一个基于Java的对象池管理系统,旨在通过对象池技术减少频繁创建和销毁对象所带来的开销,从而提高系统性能和资源利用率。对象池技术允许在需要时从池中获取已存在的对象,而不是每次都创建新对象,使用完毕...

    游戏对象池例子(兼容智能指针、工厂类)

    游戏开发中的对象池技术是一种优化资源管理的策略,它通过预先创建并缓存一组对象,以避免频繁地创建和销毁对象带来的性能开销。在这个"游戏对象池例子(兼容智能指针、工厂类)"中,我们将探讨如何利用C++实现这种...

    对象池 射击游戏 子弹的反复生成

    如果频繁地创建和销毁这些子弹,会消耗大量的内存和CPU资源,因为创建和销毁对象的过程是相对昂贵的。对象池的出现就是为了解决这个问题。 对象池的基本思想是预先创建一组对象,并将它们存储在一个集合中,当需要...

    deePool高效的JavaScript对象池

    JavaScript是一种动态类型的编程语言,广泛应用于Web开发,其在处理大量临时对象时,可能会因为频繁创建和销毁对象而导致性能下降。为了解决这个问题,开发者们引入了“对象池”概念, DeePool 就是一个实现这一概念...

    高效的,固定大小的对象池

    对象池的基本思想是通过减少频繁地创建和销毁对象来提升性能。当程序需要对象时,它会从池中获取一个已经初始化好的对象,而不是调用构造函数创建新的。使用完毕后,对象不是被销毁,而是返回到池中,供后续使用。...

    用Dictionary写的对象池

    这种方式可以减少频繁创建和销毁对象带来的性能开销,尤其是在处理大量短生命周期对象的场景下。本文将深入探讨如何使用Dictionary来实现一个简单的对象池,并分析其工作原理、优缺点以及适用场景。 首先,我们来...

    C#自定义对象池

    这样可以避免因频繁创建和销毁对象带来的性能损失。 在C#中实现自定义对象池,首先需要定义一个类来存储和管理这些对象。这个类通常包含一个队列或字典来保存对象,以及一些方法如获取对象、归还对象等。以下是一个...

    对象池简单Demo(资源包)

    1. **减少GC压力**:避免频繁创建和销毁对象,减少垃圾收集器的工作量,提高游戏运行效率。 2. **提高性能**:通过复用对象,减少实例化和销毁的时间开销。 3. **资源管理**:更好地控制对象的生命周期,避免因瞬间...

    万能对象池【C#实现】

    在编程领域,对象池是一种设计模式,用于管理对象的创建和销毁,以提高程序性能,尤其是在频繁创建和销毁对象的场景下。本文将详细讲解如何使用C#语言实现一个通用的对象池,以及它背后的原理和优势。 首先,理解...

    Java对象池技术的原理及其实现

    1. **减少创建与销毁开销**:频繁地创建和销毁对象会导致大量的CPU时间消耗在内存分配和垃圾回收上,而对象池能够有效减少这种开销。 2. **节省内存资源**:对象池限制了对象的最大数量,避免了大量临时对象占用内存...

    C++对象池源码示例

    对象池是一种优化资源管理的技术,特别是在频繁创建和销毁对象的场景下。本篇将深入探讨对象池的概念、工作原理以及如何在C++中实现对象池。 对象池的基本思想是预先创建并维护一组对象,而不是每当需要时就动态地...

    性能优化_对象池

    "对象池"是一种常见的性能优化策略,它针对的是频繁创建和销毁对象所导致的性能损失。本文将深入探讨对象池的概念、工作原理以及在实际应用中的优势和注意事项。 对象池的基本思想是预先创建并维护一组对象,而不是...

Global site tag (gtag.js) - Google Analytics