`
java--hhf
  • 浏览: 309123 次
  • 性别: 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  
凑人气~~~~

相关推荐

    java设计模式,单例模式学习示例源码,创建单例,配置文件读取

    在Java编程领域,设计模式是一种被广泛采用...总结来说,本压缩包中的示例可能包括了不同实现方式的单例模式以及如何从配置文件中读取数据。这些知识点对于理解和应用Java设计模式以及进行有效的资源管理具有重要意义。

    java单例模式课程.pdf

    在上述的场景中,我们探讨了如何通过单例模式来优化读取配置文件的过程。配置文件是许多应用程序的重要组成部分,它们通常存储应用程序运行时需要的参数和设置。 在不用模式的解决方案中,我们创建了一个名为`...

    java单例模式.doc.doc

    在读取配置文件等场景下,使用单例模式可以有效地管理配置对象,确保数据一致性并节约系统资源。通过多种实现方式,如饿汉式、懒汉式、静态内部类和枚举单例,可以根据需求选择最适合的实现策略。

    单例模式的Java示例代码

    在实际应用中,我们可能需要读取配置文件来获取单例对象的属性或行为。例如,一个管理数据库连接的单例类,可以读取配置文件来设置数据库URL、用户名和密码。这样,整个程序只需一个数据库连接池,提高资源利用率。 ...

    01 设计模式之单例模式.pdf

    在提供的内容中,讨论了配置文件和其对应的Java类(ThirdConfig),这个类用于读取配置文件中的信息,并在内存中保持一个配置对象的实例。如果每次需要配置信息时都创建一个新的实例,那么就会有多次IO操作,并且...

    单例模式应用DEMO SHOW

    1. **配置类**:如配置文件的读取和管理。 2. **缓存**:数据库查询结果的缓存,减少重复查询。 3. **日志服务**:在整个系统中,只需要一个日志服务来记录日志。 4. **线程池**:系统中只需要一个线程池来管理所有...

    单例模式-----<ant求职记之设计模式>

    在Java或C#等面向对象的语言中,单例模式广泛用于控制资源的共享,比如数据库连接、线程池或者配置文件的读取等。这种模式的主要优点在于它可以减少系统内存中的对象数量,避免因为频繁创建和销毁对象而带来的性能...

    单例设计模式

    在软件开发中,读取配置文件的类通常也会采用单例模式,因为频繁创建新对象来读取配置并不高效。网站的计数器使用单例模式可以保证数据同步,避免多线程环境下的计数混乱。日志应用通常也需要单例,因为共享的日志...

    java简单音乐播放器源程序

    此外,可能还需要用到FileReader和BufferedReader等类来读取配置文件或用户设置。 6. **集合框架**:Java集合框架(如ArrayList或LinkedList)可能被用来存储音乐文件的信息,比如文件路径、歌曲名等。这些集合可以...

    microsoft.net gotchas

    尽量减少频繁读取配置文件,考虑缓存配置信息。 15. **数据库连接池**:合理使用数据库连接池可以提高数据库访问性能,但过多的打开和关闭连接会增加池的负担,应使用`using`语句管理连接。 通过理解并避免这些...

    java“连连看”源程序

    9. **设计模式**:"连连看"源码中可能会使用到单例模式(如全局的GameManager)、工厂模式(创建棋子对象)等设计模式,以提高代码的可维护性和复用性。 通过分析这个"连连看"的源程序,我们可以深入理解Java GUI...

    java100例

    20. **设计模式**:常见的设计模式如工厂模式、单例模式、观察者模式、装饰器模式等。 以上知识点涵盖了Java开发中的关键部分,通过"java100例"的实例学习,可以帮助初学者逐步建立坚实的Java编程基础,同时对有...

    Java极品学习资料

    - 示例代码展示多态的实现方法及其优势。 **关于继承与实现的问题** - **继承**:子类继承父类的所有属性和方法。 - **实现**:通常指实现接口,即实现接口中声明的所有抽象方法。 - 示例代码说明两者之间的区别...

    Capitals

    11. **设计模式**:可能涉及到单例模式(Singleton)来维护全球唯一的首都数据源,工厂模式(Factory)来创建城市对象,或装饰器模式(Decorator)来扩展城市类的功能。 12. **异常处理**:在处理数据或网络请求时...

    典型值

    6. **设计模式的典型应用**:单例模式、工厂模式、观察者模式等设计模式在Java编程中非常常见,它们提供了解决特定问题的标准结构和"典型"实现。 7. **JVM内存模型的典型配置**:Java虚拟机(JVM)的堆内存、栈内存...

Global site tag (gtag.js) - Google Analytics