2012-01-18 59 views
9

我有很多類與靜態最終字段被用作默認值或配置。什麼是創建全局配置文件的最佳方法?我應該將這些字段移動到單個靜態類,使用屬性文件還是什麼?使用屬性文件,而不是靜態最終變量

編輯:我需要在java類和xhtml頁面中使用這個值。價值觀不依賴於環境。我可以編譯項目來設置新的值 - 沒問題。

+1

單例可能會比純靜態類更好;你可以將它與一個屬性文件結合起來,它可能是最好的方法。 – Viruzzo 2012-01-18 13:14:38

+0

我會把他們扔進一個屬性文件中......當需要國際化時,這特別有用。 – mre 2012-01-18 13:15:11

+1

爲什麼你想要一個全局配置文件?如果這些是常量,則不需要將它們在屬性文件中外化。如果這些常量被Foo類使用,那麼最好的地方是Foo類。 – 2012-01-18 13:15:44

回答

20

答案取決於...

  • 把東西在屬性文件中是否改變取決於運行時環境(如數據庫連接設置,國外的服務器IP地址)的值,或者可能會在未來改變常/很快
  • 喜歡使用enumstatic final常數,在可能情況下(避免「stringly輸入」代碼)
  • 找到可能有你想要的現有的庫(例如使用TimeUnit幾小時轉換爲秒,而不是static final int SECONDS_IN_HOUR = 3600;
  • 剩下的事情(希望不會很快改變),使用public static final,對其擁有「最多所有權」的類
  • 避免具有返回常量的靜態方法的類 - 它只是代碼膨脹
1

無論是approches都很好:

  1. 有需要final領域的一個靜態類。

  2. 有一個singelton,但適當地保存它從多個線程。

  3. 如果可能,請在靜態字段中使用enum。這樣您可以將相關字段分組在一起。

如果這些是應用程序級別的值,我更喜歡static類比singelton。

而且,您應該決定這些常數值或配置值是否隨時有所不同。

1

是,es屬性文件始終適用於配置。有多種方式可以讀取它,一種是apache commons-configuration。

如果這些屬性是依賴於環境的,則將它們外部化(outisde項目),並設置它們的路徑(例如使用-Dconfig.location=..)。如果它們不依賴於環境而改變,只需將屬性文件放在類路徑中即可。

請參閱我的this article關於環境依賴屬性。

然後,您可以爲Properties/Configuration/...對象創建一個static持有者,或者,如果可能的話,在需要的地方注入(如果使用DI框架)值。

0

這是一件好事,讓他們在一個地方。屬性文件還是靜態類?屬性文件應該用於例如本土化。例如靜態類字符串常量。

1

對於我來說,這些方法之間的主要區別是可以在不更改代碼的情況下更改值。

對於靜態final字段,您必須重新編譯源以使用新值。對於.properties文件,您通常必須重新啓動可能由系統管理員完成的應用程序。

所以它似乎是的問題,它應該是否可更改以及是否應該可用於某人一個開發者。(從某種意義上說這是一個問題,誰是「主管」這些值:開發人員或系統管理員/用戶等)

1

我最喜歡的方法是如下:

public class MyProperties { 
private static final String BUNDLE_NAME = "my.package.MyProperties"; //$NON-NLS-1$ 

private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle 
     .getBundle(BUNDLE_NAME); 


private MyProperties() { 
} 

public static long getLong(String key) { 
    String strValue = getString(key); 
    long result = -1; 
    try { 
     result = Long.parseLong(strValue); 
    } catch (Exception exc) { 
     logger.error(exc.getLocalizedMessage()); 
    } 
    return result; 
} 

public static int getInteger(String key) { 
    String strValue = getString(key); 
    int result = -1; 
    try { 
     result = Integer.parseInt(strValue); 
    } catch (Exception exc) { 
     logger.error(exc.getLocalizedMessage()); 
    } 
    return result; 
} 

public static String getString(String key) { 
    String returnValue = System.getProperty(key); 
    if(returnValue != null && returnValue.length() > 0) { 
     if(logger.isDebugEnabled()) { 
      logger.debug(key+" assigned by system property"); 
     } 
     return returnValue; 
    } 
    try { 
     returnValue = RESOURCE_BUNDLE.getString(key); 
    } catch (MissingResourceException e) { 
     returnValue = '!' + key + '!'; 
    } 
    return returnValue; 
} 
} 

這個簡單的類優先搜索系統屬性中的鍵然後放在資源束中。這意味着您可以使用-Dkey = value命令行選項覆蓋屬性設置。