2012-12-03 142 views
1

我有一类配置至极的样子说:在Java管理配置(初始配置/保存/加载配置)

public Class Config { 

    public static int someIntValue = 0; 
    public static String someText = "some text"; 

} 

什么,我想现在要做的就是保存和加载这个配置,有也是初始配置,如果没有需要加载另一个。所以配置可以在程序中的任何位置改变。

我想出什么样的主意是Singelton状的图案

public Class Config { 

    public static Config instance; 

    private int someIntValue = 0; 
    private int String someText = "some text"; 

    public static Config getInstance(){ 
    if(instance == null) 
    instance = new Config(); 
    return instance; 
    } 

    public void setInstance(Config config){ 
    this.instance = config; 
    } 
    //getter/setter 
    ... 

} 

但最终它并不像最好的方法和IM不太喜欢它:/ 也许你们能帮助我一个通常的/“最佳实践”的方式来做到这一点。

问候 制造

+0

为了使它成为单例,你需要Config.java的私有默认构造函数 – Subin

+0

在应用程序运行时期间,很少修改任何配置。如果他们是,我会将他们称为状态而不是配置 – Subin

+0

是否要将此配置保存在某处并加载它或仅在内存中运行? – vels4j

回答

1

我只想用java.util.Properties,或周围的一些包装。另一个好办法是java bean和类似xstream来保存/加载的东西。

+0

好吧,那么最简单的方法是什么?不想花太多时间在这,我想保持尽可能简单:) – made

+0

属性是最简单的方法,他们可用没有额外的代码,没有外部库。仅当您需要更方便地处理列表变量,复杂的数据类型等时才扩展它们。 – xeye

+0

好的。我看看那个。多谢! – made

0

通常在Java中用于配置使用属性文件。然后使用ResuorseBundle来读取属性。

你的“单身人士”不是传统意义上的单身人士。 1)字段实例必须是私人的 2)删除SetInstance方法 3)你应该让你的单例线程安全。

0

如果您想避免在java.util.Properties中编写样板代码,您可以查看一下可以为您做的事情:OWNER API

它可以根据您的需求进行配置,并且与java.util.Properties(阅读文档)相比,它提供了一些额外的整洁功能。

例子。你定义一个接口与你的配置参数:

public interface ServerConfig extends Config { 
    int port(); 
    String hostname(); 
    @DefaultValue("42") 
    int maxThreads(); 
    @DefaultValue("1.0") 
    String version(); 
} 

然后你使用这样的:

public class MyApp { 
    private static ServerConfig cfg = ConfigFactory.create(ServerConfig.class); 
    private MainWindow window; 

    public MyApp() { 
     // you can pass the cfg object as dependency, example: 
     window = new MainWindow(cfg); 
    } 

    public void start() { 
     window.show(); 
    } 

    public static void main(String[] args) { 
     // you can use it directly, example: 
     System.out.println("MyApp version " + cfg.version() + " copyright (c) ACME corp."); 
     MyApp app = new MyApp(); 
     app.start(); 
    } 
} 

您可以定义CFG对象作为成员实例在需要的类,或者您也可以通过实例给你需要的构造函数和方法。

版本1.0.4将很快发布,它还将包括“热重载”和许多改进。