如何使用Java Singleton模式
Java Singleton模式属于管理实例化过程的设计模式家族。Singleton是一个无法实例化的对象。这种设计模式暗示,在任何时候,只能由JVM创建一个Singleton(对象)实例。
如果实例不存在,你通过创建类的新实例的方法建立一个类来执行这个模式;如果存在类的一个实例,就只会返回那个对象的一个引用。
Singleton模式的运行机制
以下是Singleton模式的一个典型例子:
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
// Private constructor suppresses generation of
// a (public) default constructor
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
标准的Singleton模式并不使用直接静态变量实例化进行声明——它实例化构造器中的一个静态实例变量,而不查看它是否已经存在:
public class ClassicSingleton {
private static ClassicSingleton INSTANCE = null;
private ClassicSingleton() {
// Exists only to defeat instantiation.
}
public static ClassicSingleton getInstance() {
if(INSTANCE == null) {
INSTANCE = new ClassicSingleton();
}
return INSTANCE;
}
}
Singleton类的默认构造器被设为私有,这样做可防止其它类使用new关键字直接将对象实例化。对返回Singleton对象的实例方法应用一个静态修饰符,这使得它成为一个类级方法,不创建对象即可进行访问。
何时需要使用Singleton
当你只需要一个类实例时,Singleton才真正有用;如果类拥有几个实例,使用Singleton就不再适用。
设计系统时,你通常希望控制对象的用法,防止用户(包括你自己)复制对象或建立新实例。例如,你可以使用它创建一个连接池。每次程序需要往数据库中写入内容时才创建一个新连接的做法并不明智;相反,一个或一组已经在池中的连接就可以使用Singleton模式实例化。
Singleton模式常常和工厂方法模式一同使用,创建一个系统级资源,使用这个资源的代码并不知道它的特殊类型。抽象窗口工具包(AWT)就是组合使用这两个模式的典型例子。在GUI应用程序中,对每个应用程序实例,你一般只需要一个图形元素的实例,如打印(Print)对话框或OK按钮。
注意潜在的问题
虽然Singleton设计模式是最简单的设计模式之一,但它也存在一些缺陷。多线程应用程序中的构造问题
在多线程应用程序中,你必须仔细构造Singleton模式。当Singleton不存在时,如果两个线程即将同时执行创建方法,这两个线程必须检查Singleton实例,但只有一个线程应当创建新对象。这个问题的典型解决办法就是对类使用相互排斥,指出对象正在被实例化。这是Singleton的一个线程安全的版本:
public class Singleton
{
// Private constructor suppresses generation
// of a (public) default constructor
private Singleton() {}
private static class SingletonHolder
{
private final static Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance()
{
return SingletonHolder.INSTANCE;
}
}
另一个解决办法是在getInstance()方法声明中添加synchronized关键字:
public static synchronized Singleton getInstance()
提前考虑克隆预防
你仍然可以使用对象的clone()方法克隆对象,建立一个Singleton对象。要禁用这一功能,你需要禁用对象的克隆方法,这产生一个CloneNotSupportedException例外。
public Object clone() throws
CloneNotSupportedException {
throw new CloneNotSupportedException();
}
考虑使singleton类位于最后
你可能希望将Singleton类放在最后,以避免Singleton的子类造成其它问题。
不要忘记垃圾收集
根据不同的执行,你的Singleton类和它的所有数据可能被当作垃圾收集。因此,在应用程序运行时,你必须保证存在一个Singleton类的实时引用。
结论
Singleton模块得到广泛地使用,并证实可用于软件设计。虽然这个模式并非Java专有,但它已成为Java编程的一个典型应用。尽管这个模式相当简单,但还是要记住我在本文中描述的Singleton模式的限制。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Vista下arp -s项添加失败
C:\\Users\\est>arp -s 202.115.22.129 00-0d-bc-78-07-3f
ARP 项添加失败: 5
C:\\Users\\est>netsh i i show in
Idx Met MTU 状态 名称
--- --- ----- ----------- -------------------
1 50 4294967295 connected Loopback Pseudo-Interface 1
8 20 1500 connected 本地连接
C:\\Users\\est>netsh -c "i i" add neighbors 8 "202.115.22.129" "00-0d-bc-78-07-3f"
C:\\Users\\est>arp -a
接口: 192.169.1.120 --- 0x8
Internet 地址 物理地址 类型
202.115.22.129 00-0d-bc-78-07-3f 静态
202.115.22.131 00-17-a4-e2-07-3f 动态
202.115.22.132 00-17-08-2e-78-41 静态
202.115.22.135 00-01-02-fd-4c-d6 动态
202.115.22.141 00-e0-5c-41-0d-98 动态
202.115.22.148 00-f0-4c-85-f4-4e 动态
202.115.22.149 00-0a-e4-fb-90-ac 动态
202.115.22.154 00-0a-eb-4f-1c-e2 动态
202.115.22.191 ff-ff-ff-ff-ff-ff 静态
224.0.0.22 01-00-5e-00-00-16 静态
C:\\Users\\est>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SQL Backup
javaScript中URL编码转换,escape() encodeURI() encodeURIComponent
在使用url进行参数传递时,经常会传递一些中文名的参数或URL地址,在后台处理时会发生转换错误。在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原来发生不一致。使用服务器端的urlEncode函数编码的URL,与使用客户端javascript的encodeURI函数编码的URL,结果就不一样。 javaScript中的编码方法: escape() 方法: 采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。unescape方法与此相反。不会被此方法编码的字符: @ * / + 英文解释:MSDN JScript Reference: The escape method returns a string value (in Unicode format) that contains the contents of [the argument]. All spaces, punctuation, accented characters, and any other non-ASCII characters are replaced with %xx encoding, where xx is equivalent to the hexadecimal number representing the character. For example, a space is returned as "%20." Edge Core Javascript Guide: The escape and unescape functions let you encode and decode strings. The escape function returns the hexadecimal encoding of an argument in the ISO Latin character set. The unescape function returns the ASCII string for the specified hexadecimal encoding value. encodeURI() 方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + ' 英文解释:MSDN JScript Reference: The encodeURI method returns an encoded URI. If you pass the result to decodeURI, the original string is returned. The encodeURI method does not encode the following characters: ":", "/", ";", and "?". Use encodeURIComponent to encode these characters. Edge Core Javascript Guide: Encodes a Uniform Resource Identifier (URI) by replacing each instance of certain characters by one, two, or three escape sequences representing the UTF-8 encoding of the character encodeURIComponent() 方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( ) 英文解释:MSDN JScript Reference: The encodeURIComponent method returns an encoded URI. If you pass the result to decodeURIComponent, the original string is returned. Because the encodeURIComponent method encodes all characters, be careful if the string represents a path such as /folder1/folder2/default.html. The slash characters will be encoded and will not be valid if sent as a request to a web server. Use the encodeURI method if the string contains more than a single URI component. Mozilla Developer Core Javascript Guide: Encodes a Uniform Resource Identifier (URI) component by replacing each instance of certain characters by one, two, or three escape sequences representing the UTF-8 encoding of the character. 因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者encodeURIComponent。 另外,encodeURI/encodeURIComponent是在javascript1.5之后引进的,escape则在javascript1.0版本就有。 英文注释:The escape() method does not encode the + character which is interpreted as a space on the server side as well as generated by forms with spaces in their fields. Due to this shortcoming, you should avoid use of escape() whenever possible. The best alternative is usually encodeURIComponent().Use of the encodeURI() method is a bit more specialized than escape() in that it encodes for URIs [REF] as opposed to the querystring, which is part of a URL. Use this method when you need to encode a string to be used for any resource that uses URIs and needs certain characters to remain un-encoded. Note that this method does not encode the ' character, as it is a valid character within URIs.Lastly, the encodeURIComponent() method should be used in most cases when encoding a single component of a URI. This method will encode certain chars that would normally be recognized as special chars for URIs so that many components may be included. Note that this method does not encode the ' character, as it is a valid character within URIs. |
如何在Firefox中强制重画页面
How to force firefox redraw ( admin.net [at] 163.com)
Firefox中,有时会发现使用JS改变了一些表格的宽度或页面,但Firefox并没有重画,手动调整一下窗口大小后才正常。
可以使用下面的代码,让Firefox强制重画网页:
var objTemp=document.firstChild;
if (objTemp)
{
//Tom Zhou (admin.net[at]163.com
objTemp.style.width = objTemp.offsetWidth - 1;
objTemp.style.width = objTemp.offsetWidth + 1;
}
如何在网页中显示邮件地址
如果将邮件地址直接显示在网页上的话,可能会被很多邮件扫描器扫到,接踵而来的是大量的垃圾邮件。
垃圾邮件是一个复杂的课题,我个人认为已经超出了技术范畴了,垃圾邮件的防治也是比较麻烦的问题,如果你的邮件地址被垃圾邮件发送者得到的话,即使是Yahoo,Gmail,163,同样会有大量的垃圾邮件骚扰。所以,防治垃圾邮件的一个重要方法,就是不要在网站上公布你的邮件地址。
目前,有效的做法有几种:
1. 使用图片显示邮件地址,代替文本形式的Email地址 (请访问 http://www.makepic.com 生成图片形式的邮件地址)
2. 邮件地址中不带@字符,例如:admin.net(At )163.com
以下两种方式都有弊端,浏览者不可以直接复制邮件地址,也不可以直接点击发送邮件。
另外一些方法,是使用Javascript来显示邮件地址,这样,在网页中没有username@domain.com形式的地址,通过Javascript来显示。Javascript如下:
//Author: admin.net( AT )163.com http://www.eit.name/
function displayEmail(userName,displayName,domainName,className) {
var tmpEmail;
if (userName.length==0 || domainName.length==0) return;
if (displayName.length==0) displayName=userName+"@"+domainName;
if (className.length>0) className=" class='"+className+"'";
tmpEmail=userName+"@"+domainName;
document.write("<a href='mailto:"+tmpEmail+"'"+className+">"+displayName+"</a>");
}
调用方法:
<script language="javascript">displayEmail("admin.net","鱼漂","163.com","email");</script>
使用这种方式,不影响浏览者的使用和显示,但却有效的防止邮件地址被扫描。
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>解决"由于应用程序配置不正确,应用程序未能启动"的问题
最近安装了MindManager 7.1,安装完后,无法启动,总是提示"由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。"。按照网上的说法,MindManager 7.1是用VC2005 SP1编译的,我安装了VC2005 SP1的运行库,仍然不能解决问题。刚开始还怀疑是.net framewok的问题,重装过也没有效果。
后来仔细想想,我的机器上已经安装了VC2005,但没有打到SP1,可能与有这关系,MindManager7.1首先找到了VC2005(没有sp1)的运行库运行,结果发现不匹配,所以报错。
(鱼漂原创,转载请注明)
于是,按下面的思路修复了此问题:
1. 重新安装vc2005 sp1 runtime library (google搜索vc2005 sp1,即可以MS官方网站找到下载)
2. 在C:\Windows目录,开始搜索"msvcr80.dll"文件,果然发现很多个版本的msvcr80.dll,其中,C:\Windows\system32目录下的应该是安装Visual Studio 2005(没有sp1)带过来的,不是sp1版本,而MindManager7.1首先会有这个版本启动,由于版本不匹配,所以启动失败。
### http://www.eit.name ###
3. 解决方法,将vc20005sp1版本目录下的3个DLL文件,复制到MindManager7.1的安装目录即可,vc2005sp1 runtime library的安装目录为:
C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
(版本号为8.0.50727.762)
HTML2Image For Linux and Unix
Have you ever wanted a solution for converting html to image on Linux/Unix? Html2Image for Linux is a command line tool that can convert html to image on Linux or Unix platform.
html2image linux now solves this problem. It is a standalone tool package that can generate raster image from html content. The html page can be on a remote server or local file disk. html2image can convert them into images on the fly.
html2image can convert html to bmp, convert html to png and convert html to jpg. The URL and image file name can be specified on command line paramters, which is useful for batch processing a lot of html files. You can also call the command line program from your favourite programming languages like php or C++ in order to add html to image functionality to your server applications.
You can also control the compression quality of the jpeg image by specifying the quality parameters on command line.
http://www.guangmingsoft.net/htmlsnapshot/html2image.htm
基础实用:四类文件在线转换器服务网推荐
1、通用类:
zamzar 是一个很牛的在线转换工具,能转换100M以下的到40种格式的文件,包括图象格式、文档格式、音频格式、视频格式等,几乎囊括了我们熟知的所有文件格式,可以自由转换,功能相当不错的了,可以说是一个比较全能的工具了,而且页面简洁易用,速度也很不错!!
Youconvertit 提供堪称最完美的在线文件转换服务,能在线对文档、图片、音频以及视频文件进行转换。能在41种文档格式(常用如html,txt,ppt,doc,pdf,rtf,csv,psd,xls,xhtml,xls等)、85种图片格式(常用如bmp,jpg,gif,tiff,ico,png等)、7种音频格式(aac、aif、aiff、mp3、ra、wav、wma)、11种视频格式(3gp、asf、avi、flv、mov、mp4、mpeg、mpg、rm、swf、wmv)进行相互转换。实在是一项非常不错的服务。
Xurrency 是在线的当前货币兑换查询工具,界面非常简单,选择币种,输入金额即可快速获得目标币种的数额。同时,底部还有一个实时的汇率表,直观的反馈一些主要币种的现时汇率。放在此类有些牵强,对一些朋友会很有用。
>>>>>>>>>>>>>>
[软件介绍]ByteOMeter & NetLimiter
ByteOMeter
一款功能强大的带宽测试和监控软件,它可以测量和显示出你网络的所有流量,可以创建网络上所有计算机的流量的统计表格,测量和显示所有电脑从 Internet 下载和上传的流量,主要功能:
1、用图形和数字显示带宽使用率
2、自定义网络带宽可视化风格
3、能显示所有的端口和网络适配器
4、能显示所有的网络跟踪
5、具有自动报警功能
6、可生成基于端口和网卡的统计报表
7、安装配置非常简单,支持LAN, WAN, VPN, ADSL, xDSL, Modem, Dial-Up等网络类型,可靠性高
NetLimiter
NetLimiter是一款运行在Windows 98/98SE/Me/2000/XP/2003/Vista上的网络流量控制软件。
通过它,您可以直接来控制每个程序对Internet的访问以及流量分配情况。例如,您可以用NetLimiter来为单个程序甚至是单个网络连接限定其上载和下载速度。通过非常简单的设置,NetLimiter就可以让你随心所欲地在各个程序之间分配网络带宽。
随着宽频网络的日益普及,使用P2P类下载软件(如:BT、迅雷、eDonkey、eMule..等等)的人越来越多,但是在使用此类软件时,通常会因他们的高速而「榨干」了我们有限的带宽,其他需要透过网络来联机的应用程序就几乎动弹不得了!有时想一边下载一边浏览网页都不行,蜗牛般的页面打开速度和极高速的文件下载速度总是让电脑使用者在一旁哭笑不得...
NetLimiter它不仅可以控制某个应用程序的上传/下载使用带宽,还可以实时监控所其占用的带宽,甚至于,你可以限制你的电脑的总上传/下载带宽!网络速度分配完全随心所欲。不仅可以让你随心的分配有限的网络带宽,他还能帮你楸出占用你大量带宽的元凶呢~(例如某些木马、间谍程序、流氓软件、病毒等等),现在你可以通过他完全掌握你的网络传输情况了~
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>