⽤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 = Class().getResourceAsStream("/test.properties");
if (is != null) {
try {
} catch (IOException e) {
} finally {
try {
is.close();
} catch (Throwable t) {}
}
}
}
public String getConfigValue(String key) {
Property(key);
}
}enum c++
【3】读取配置⽂件临时保存数据到常量内SystemConstants.java
package hhf.propertie;
/**
* 缓存配置⽂件信息
* @author HHF
* 2014年12⽉29⽇
*/
public class SystemConstants {
//info
public static final String DATA_A = ConfigValue("a_text");
public static final String DATA_B = ConfigValue("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;附上测试⼯程源码)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论