2012-12-03 105 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將很快發佈,它還將包括「熱重載」和許多改進。