2013-02-14 37 views
4

這是一個簡單的問題,我無法找到最後的答案。爲什麼不使用ResourceBundle而不是Properties?

我可以從config.properties文件加載字符串屬性(例如:準備語句的查詢)。假設我想要連接數據庫連接。

如果我想借此從文件信息,我所能做的只是在一個類中的以下內容:

private static final ResourceBundle BUNDLE = ResourceBundle.getBundle("scheduler"); 
    private static final String DRIVER = BUNDLE.getString("bd.driver"); 
    private static final String CONNECTIONURL =BUNDLE.getString("bd.url"); 
.... 

而是我見過很多人建議使用替代屬性,然後我會在做同樣的像這樣的東西(如果我想保持類的靜態,而不是有一個適當的構造函數):

static { 
     prop = new Properties(); 
     try {    prop.load(ReportsDB.class.getClassLoader().getResourceAsStream("config.properties")); 
     } catch (IOException ex) { 
      Logger.getLogger(ReportsDB.class.getName()).log(Level.SEVERE, null, ex); 
      throw new RuntimeException(ex); 
     } 
    } 

    private static final String DRIVER = prop.getProperty("bd.driver"); 
    private static final String CONNECTIONURL = prop.getProperty("bd.url"); 

那麼,爲什麼我不應該使用的ResourceBundle代替Properties當第二個是更詳細?

回答

8

那麼,爲什麼我不應該使用ResourceBundle而不是屬性,當第二個更詳細?

因爲這不是ResourceBundle的用途。 description of the class開頭爲:

資源束包含特定於語言環境的對象。當您的程序需要特定於語言環境的資源(例如字符串)時,程序可以從適合當前用戶語言環境的資源包中加載它。通過這種方式,您可以編寫程序代碼,這些程序代碼在很大程度上獨立於用戶的語言環境,將資源包中大部分(如果不是全部)特定於語言環境的信息隔離開來。

是否有任何這樣的聲音像你的用例?我不這麼認爲。

聽起來像是問題是純粹是加載屬性文件的詳細程度:所以編寫一個實用程序方法來做到這一點。那麼你的代碼可以是簡單的:

private static final Properties CONFIGURATION = PropertyUtil.load("scheduler.properties"); 
private static final String DRIVER = CONFIGURATION.getString("bd.driver"); 
private static final String CONNECTIONURL = CONFIGURATION.getString("bd.url"); 

誠然,我並不熱衷於在這樣的訂單相關的方式有靜態字段初始...我會忍不住來封裝所有的配置在一個單獨的類,所以你可以寫:

private static final SchedulerConfiguration CONFIG = 
    SchedulerConfiguration.load("scheduler.properties"); 

然後用CONFIG.getDriver()等可能從屬性每次取,或使用領域,或什麼的。

+0

容易,但感謝您的解釋。雖然我知道這個課程的目的是,如果它符合你的要求,爲什麼不使用它?它慢嗎?它是否有任何可能會失敗的邊界情況?也許是毫無意義的,但我真的想知道是否有任何其他原因 – 2013-02-14 20:20:07

+3

@ChristianVielma:因爲它讓你的代碼*看起來像它試圖實現一件事,當它真的試圖做別的事情時。 *至少*將其隱藏在一個地方,記錄你爲什麼要這樣做 - 但理想情況下只是使用他們想要使用的類,並且你會得到更少的驚喜。 (就像那些閱讀你的代碼一樣。) – 2013-02-14 20:24:55

0

一個具體的區別是ResourceBundle.getBundle("scheduler")將搜索類路徑中的文件(例如src包文件夾)。如果您在外部文件上撥打ResourceBundle.getBundle("myfile"),您將獲得MissingResourceException

如果你想使用一個外部文件(位於項目根例如文件),你可以使用屬性類:

Properties configuration = new Properties(); 
try (InputStream input = new FileInputStream("configuration.properties")) { 
     configuration.load(input); 
     System.out.println("Configuration value: " + configuration.getProperty("key")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
相關問題