单例枚举方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊
代码如下:
package com.fs.message.utils;
import com.aliyun.mns.client.CloudAccount;
import com.aliyun.mns.client.MNSClient;
/**
-
@see
-
-
-
-
-
防止反序列化的时候创建新的对象。
-
因此,Effective Java推荐尽可能地使用枚举来实现单例。
*/
/**
-
-
@author wangkai
-
@2016年3月28日 上午12:28:50
-
@desc:单例终极写法-枚举方式
*/
public enum MnsClientFactory {
/**
- 单实例
*/
INSTANCE;
/**
- app.properties 消息服访问配置文件
*/
private static final String FILE_NAME = "app.properties";
/**
- 访问阿里云账户信息
*/
private static CloudAccount account;
/**
- mns client need only initialize once
*/
private static MNSClient sMNSClient;
private MnsClientFactory() {
}
static{
//放入配置文件
Configs.setPath(FILE_NAME);
// mns 账户
account = new CloudAccount(Configs.getProperty("mns.accesskeyid"),Configs.getProperty("mns.accesskeysecret"),Configs.getProperty("mns.accountendpoint"));
// 创建客户端
sMNSClient = account.getMNSClient();
}
/**
- 获取MNSClient
-
- @return
*/
public MNSClient createClient() {
// 认证信息
return sMNSClient;
}
/**
- 关闭客户端 释放资源
*/
public void closeClient() {
if (sMNSClient.isOpen()) {
sMNSClient.close();
}
}
}