2014年6月30日星期一

Effective Tips 1 - 考虑用静态工厂方法代替构造器

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Effective Tips 1 - 考虑用静态工厂方法代替构造器  阅读原文»

我们有两种常见的方法获得一个类的实例。

・公有的构造器

・提供静态工厂方法(static factory method)

这一篇主要说明静态工厂方法相对于公有构造器的优劣。

相对公有的构造器,静态工厂方法有以下几大优势。

优势1.静态工厂方法的名称,因此比构造器更准确地描述返回的实例。

比如BigInteger.probablePrime方法:

publicstaticBigIntegerprobablePrime(intbitLength,Randomrnd){
if(bitLength<2)
thrownewArithmeticException("bitLength<2");
//Thecutoffof95waschosenempiricallyforbestperformance
return(bitLength<SMALL_PRIME_THRESHOLD?
smallPrime(bitLength,DEFAULT_PRIME_CERTAINTY,rnd):
largePrime(bitLength,DEFAULT_PRIME_CERTAINTY,rnd));

顺便也贴出其调用的largePrime方法:

staticBigIntegerlargePrime(intbitLength,intcertainty,Randomrnd){
p=newBigInteger(bitLength,rnd).setBit(bitLength-1);
p.mag[p.mag.length-1]&=0xfffffffe;
//Useasievelengthlikelytocontainthenextprimenumber
intsearchLen=(bitLength/20)*64;
BitSievesearchSieve=newBitSieve(p,searchLen);
BigIntegercandidate=searchSieve.retrieve(p,certainty,rnd);
while((candidate==null)||(candidate.bitLength()!=bitLength)){
p=p.add(BigInteger.valueOf(2*searchLen));
if(p.bitLength()!=bitLength)
p=newBigInteger(bitLength,rnd).setBit(bitLength-1);
p.mag[p.mag.length-1]&=0xfffffffe;
searchSieve=newBitSieve(p,searchLen);
candidate=searchSieve.retrieve(p,certainty,rnd);
returncandidate;

虽然smallPrime和largePrime最后都是通过公有构造器返回实例。

但是如果仅仅用构造器重载表达这个实例的特征,这很难让人记住什么时候应该调用什么构造器。

而提供一个名称去描述实例更为直观。

优势2.静态工厂方法不必每次都创建一个新的对象,我们可以对实例进行控制。

这样我们就能将创建好的实例缓存起来重复利用,尤其是在创建对象的代价较高的情况下。

比如Boolean.valueOf:

publicstaticfinalBooleanTRUE=newBoolean(true);
publicstaticfinalBooleanFALSE=newBoolean(false);
publicstaticBooleanvalueOf(booleanb){
return(b?TRUE:FALSE);

优势3.静态工厂方法可以返回原返回类型的子类型对象。

这一点能体现静态工厂方法的灵活性,

以EnumSet为例(秦小波老师的<改善Java程序的151个建议>一书中也提到了这一点,即建议枚举项不要超过64个):

*Createsanemptyenumsetwiththespecifiedelementtype.
*@paramelementTypetheclassobjectoftheelementtypeforthisenum
*@throwsNullPointerExceptionif<tt>elementType</tt>isnull
publicstatic<EextendsEnum<E>>EnumSet<E>noneOf(Class<E>elementType){
Enum[]universe=getUniverse(elementType);
if(universe==null)
thrownewClassCastException(elementType+"notanenum");
if(universe.length<=64)
return
Exchange2013中POP3和IMAP4  阅读原文»

每日博报 精彩不止一点关闭
Exchange2013中POP3和IMAP4

Exchange2013如同以前一样,安装完后系统就已经启动了所有用户对activesync, owa, pop, imap, mapi协议的支持。由于系统并没有设置pop3和imap4服务为自动启动。所以用户无法通过pop或imap收发邮件。

如果要启用Exchange的POP3和IMAP4功能,首先我们需要做的就是启动pop3和imap4服务,并对他们进行配置。

由于架构不同,Exchange2013中POP和IMAP4分别有两个服务,前端和后端,即 Microsoft Exchange POP3 服务、Microsoft Exchange POP3 Backend 服务、Microsoft Exchange IMAP4 服务以及 Microsoft Exchange IMAP4 Backend 服务。

Microsoft Exchange POP3、IMAP4 服务在运行客户端访问服务器角色的 Exchange 2013 计算机上运行。Microsoft Exchange POP3、IMAP4 Backend 服务在运行邮箱服务器角色的 Exchange 2013 计算机上运行。

1、启动pop3和imap4服务

在运行客户端访问服务器角色的 Exchange 2013 计算机上,

打开"服务器管理器"―"工具"―"服务"找到"Microsoft Exchange POP3" 和"Microsoft Exchange IMAP4"两个服务,设置其"属性"为"自动",然后"启动"。

在运行邮箱服务器角色的 Exchange 2013 计算机上运行。

打开"服务器管理器"―"工具"―"服务"找到"Microsoft Exchange POP3 Backend" 和"Microsoft Exchange IMAP4 Backend"两个服务,设置其"属性"为"自动",然后"启动"。

由于我们是一台Exchange2013,所以POP3和IMAP4服务都在一起

clip_image002

2、配置pop3和imap4安全登录方式

在 EAC 中,导航到"服务器"―"服务器",在服务器列表中,选择客户端访问服务器,然后单击"编辑"clip_image003

在服务器属性页面上,单击"POP3"选项卡和"IMAP4"选项卡

POP3和IMAP4默认使用【安全的TLS连接】,端口为TCP的995(pop3)和993(imap4),客户端和服务器之间的连接使用加密方式,建议保持默认。

clip_image005

clip_image007

在服务器属性页面的"POP3"和"IMAP4"属性也中向下滚动并单击"更多选项",可以设置pop3和imap4的连接限制

clip_image009

clip_image011

POP3和IMAP4的登陆方法

基本身份验证(纯文本): 端口110(pop3)、143(imap4)

如果要以明文形式发送用户名和密码,请选择此选项。使用此选项可以在没有 TLS 或 SSL 连接的情况下将用户名和密码发送到服务器。

集成 Windows 身份验证(纯文本):

如果要在没有 TLS 或 SSL 连接的情况下使用集成 Windows 身份验证,请选择此选项。

安全TLS登录: 端口995(pop3)、993(imap4)

如果需要 TLS 或 SSL 连接,请选择此选项。

clip_image013

更改设置后单击"保存",并重启POP3和IMAP4服务,以使设置生效。

3、允许 Outlook Web App 中的最终用户查看 POP3、IMAP4 和 SMTP 服务器设置

设置完pop3和imap4功能后,用户需要知道正确的服务器设置,才能使用 POP3 或 IMAP4 连接到其 Microsoft Exchange Server 2013 邮箱。 默认设置中Exchange 2013用户无法查找自己的传入 POP3 或 IMAP4 服务器设置或者传出 SMTP 服务器设置。 我们需要通过EMS配置 Exchange属性,使用户可以登录到OWA来查找自己的设置,以配置Outlook及其他客户端连接。

在EMS中设置POP3和IMAP4传入属性

Set-PopSettings -ExternalConnectionSettings {<server FQDN>:995:SSL}

阅读更多内容

没有评论:

发表评论