当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:15:00  来源:本站整理

Java情势筹划之单例情势(二)[Java编程]

赞助商链接



  本文“Java情势筹划之单例情势(二)[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

在什么情形下利用单例情势

利用单例情势的条件

利用单例情势有一个很重要的必要条件:

在一个系统要求一个类只有一个实例时才该当利用单例情势.反过来说,假如一个类可以有几个实例共存,那么就没有必要利用单例类.但是有经验的读者大概会看到很多不当地利用单例情势的例子,可见做到上面这一点并不简单,下面就是一些这样的情形.

例子一

问:我的一个系统需求一些"全程"变量.学习了单例情势后,我发现可以利用一个单例类盛放全部的"全程"变量.请示这样做对吗?

答:这样做是违反单例情势的意图的.单例情势只该当在有真正的"单一实例"的需求时才可以利用.

一个计划得当的系统不该当有所谓的"全程"变量,这些变量该当放到它们所描写的实体所对应的类中去.将这些变量从它们所描写的实体类中抽出来, 放到一个不相关的单例类中去,会使得这些变量产生错误的依靠关系和耦合关系.

例子二

问:我的一个系统需求管理与数据库的衔接.学习了单例情势后,我发现可以利用一个单例类包装一个Connection 对象,并在finalize()办法中关闭这个Connection 对象.这样的话,在这个单例类的实例没有被人引用时,这个finalize() 对象就会被调用,因此,Connection 对象就会被释放.这多妙啊.

答:这样做是不得当的.除非有单一实例的需求,不然不要利用单例情势.在这里Connection 对象可以同时有几个实例共存,不需求是单一实例.

单例情势有很多的错误利用案例都与此例子类似,它们都是试牟利用单例情势管理同享资源的生命周期,这是不得当的.

单例类的状况

有状况的单例类

一个单例类可以是有状况的(stateful),一个有状况的单例对象普通也是可变(mutable) 单例对象.

有状况的可变的单例对象常常当作状况库(repositary)利用.比方一个单例对象可以持有一个int 范例的属性,用来给一个系统供应一个数值惟一的序列号码,作为某个贩卖系统的账单号码.当然,一个单例类可以持有一个堆积,从而答应存储多个状况.

没有状况的单例类

另一方面,单例类也可以是没有状况的(stateless), 仅用做供应工具性函数的对象.既然是为了供应工具性函数,也就没有必要成立多个实例,因此利用单例情势很符合.一个没有状况的单例类也就是不变(Immutable) 单例类; 关于不变情势,读者可以拜见本书的"不变(Immutable )情势"一章.

多个JVM 系统的分离式系统

EJB 容器有本领将一个EJB 的实例跨过几个JVM 调用.由于单例对象不是EJB,因此,单例类范围于某一个JVM 中.换言之,假如EJB 在跨过JVM 后仍旧需求引用同一个单例类的话,这个单例类就会在数个JVM 中被实例化,造成多个单例对象的实例呈现.一个J2EE利用系统大概分布在数个JVM 中,这时刻不一定需求EJB 就可以造成多个单例类的实例呈目前差别JVM 中的情形.

假如这个单例类是没有状况的,那么就没有问题.因为没有状况的对象是没有辨别的.但是假如这个单例类是有状况的, 那么问题就来了.举例来说,假如一个单例对象可以持有一个int 范例的属性,用来给一个系统供应一个数值惟一的序列号码,作为某个贩卖系统的账单号码的话,用户会看到同一个号码呈现好几次.

在任何利用了EJB、RMI 和JINI 技术的分离式系统中,该当避免利用有状况的单例情势.

多个类加载器

同一个JVM 中会有多个类加载器,当两个类加载器同时加载同一个类时,会呈现两个实例.在很多J2EE 服务器答应同一个服务器内有几个Servlet 引擎时,每一个引擎都有独立的类加载器,经有差别的类加载器加载的对象之间是绝缘的.

比方一个J2EE 系统所在的J2EE 服务器中有两个Servlet 引擎:一个作为内网给公司的网站管理人员利用;另一个给公司的外部客户利用.二者同享同一个数据库,两个系统都需求调用同一个单例类.假如这个单例类是有状况的单例类的话,那么内网和外网用户看到的单例对象的状况就会差别.除非系统有调和机制,不然在这种情形下该当尽大概避免利用有状况的单例类.


  以上是“Java情势筹划之单例情势(二)[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .