`
java--hhf
  • 浏览: 304930 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

用enum实现单例模式的方法来读取配置文件

阅读更多

    使用enum关键字来实现单例模式的好处是可以提供序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。—— 来自《Effective Java》

【1】配置文件test.properties

#info
a_text=I am text A
b_text=I am text B

【2】枚举实例AppContext.java 

package hhf.propertie;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
 * 读取配置文件
 * @author HHF
 * 2014年12月29日
 */
public enum AppContext {

	INSTANCE;
	
	private volatile Properties configuration = new Properties();
	
	public void init() {
		InputStream is = this.getClass().getResourceAsStream("/test.properties");
        if (is != null) {
            try {
                this.configuration.clear();
                this.configuration.load(is);
            } catch (IOException e) {
            } finally {
                try {
                    is.close();
                } catch (Throwable t) {}
            }
        }
	}
	
	public String getConfigValue(String key) {
		  return this.configuration.getProperty(key);
	}	
}

【3】读取配置文件临时保存数据到常量内SystemConstants.java 

package hhf.propertie;
/**
 * 缓存配置文件信息
 * @author HHF
 * 2014年12月29日
 */
public class SystemConstants {
	//info
	public static final String DATA_A = AppContext.INSTANCE.getConfigValue("a_text");
	public static final String DATA_B = AppContext.INSTANCE.getConfigValue("b_text"); 
}

 【4】测试文件Main.java

public class Main {

	public static void main(String[] args) {
		AppContext.INSTANCE.init();
		System.out.println(SystemConstants.DATA_A);
		System.out.println(SystemConstants.DATA_B);
	}

}

        一个enum常量(这里是INSTANCE)代表了一个enum的实例,enum类型只能有这些常量实例。标准保证enum常量(INSTANCE)不能被克隆,也不会因为反序列化产生不同的实例,想通过反射机制得到一个enum类型的实例也是不行的。

(PS;附上测试工程源码)

1
0
分享到:
评论
4 楼 beck5859509 2014-12-31  
java--hhf 写道
beck5859509 写道
AppContext.INSTANCE.init(); 可以被调用多次。
如果可以把这步封装在enum里面会更好,看看用static{}语句块能否解决。

使用这个的主要目的还是 一个工程里只需要主main函数里面init一次以后 其他的各个模块均可以直接使用SystemConstants里面的数据 而不需要再多次去处理配置文件
换句话说,也可以理解为主线程只跑一次,其他的子线程可以随意的调用配置文件数据
你觉得呢

只是觉得不暴露会更好一点。封装性会更好。
3 楼 java--hhf 2014-12-30  
beck5859509 写道
AppContext.INSTANCE.init(); 可以被调用多次。
如果可以把这步封装在enum里面会更好,看看用static{}语句块能否解决。

使用这个的主要目的还是 一个工程里只需要主main函数里面init一次以后 其他的各个模块均可以直接使用SystemConstants里面的数据 而不需要再多次去处理配置文件
换句话说,也可以理解为主线程只跑一次,其他的子线程可以随意的调用配置文件数据
你觉得呢
2 楼 beck5859509 2014-12-30  
AppContext.INSTANCE.init(); 可以被调用多次。
如果可以把这步封装在enum里面会更好,看看用static{}语句块能否解决。
1 楼 java--lwy 2014-12-29  
凑人气~~~~

相关推荐

Global site tag (gtag.js) - Google Analytics