我有很多類與靜態最終字段被用作默認值或配置。什麼是創建全局配置文件的最佳方法?我應該將這些字段移動到單個靜態類,使用屬性文件還是什麼?使用屬性文件,而不是靜態最終變量
編輯:我需要在java類和xhtml頁面中使用這個值。價值觀不依賴於環境。我可以編譯項目來設置新的值 - 沒問題。
我有很多類與靜態最終字段被用作默認值或配置。什麼是創建全局配置文件的最佳方法?我應該將這些字段移動到單個靜態類,使用屬性文件還是什麼?使用屬性文件,而不是靜態最終變量
編輯:我需要在java類和xhtml頁面中使用這個值。價值觀不依賴於環境。我可以編譯項目來設置新的值 - 沒問題。
答案取決於...
enum
到static final
常數,在可能情況下(避免「stringly輸入」代碼)TimeUnit
幾小時轉換爲秒,而不是static final int SECONDS_IN_HOUR = 3600;
)public static final
,對其擁有「最多所有權」的類無論是approches都很好:
有需要final
領域的一個靜態類。
有一個singelton,但適當地保存它從多個線程。
如果可能,請在靜態字段中使用enum
。這樣您可以將相關字段分組在一起。
如果這些是應用程序級別的值,我更喜歡static
類比singelton。
而且,您應該決定這些常數值或配置值是否隨時有所不同。
是,es屬性文件始終適用於配置。有多種方式可以讀取它,一種是apache commons-configuration。
如果這些屬性是依賴於環境的,則將它們外部化(outisde項目),並設置它們的路徑(例如使用-Dconfig.location=..
)。如果它們不依賴於環境而改變,只需將屬性文件放在類路徑中即可。
請參閱我的this article關於環境依賴屬性。
然後,您可以爲Properties
/Configuration
/...對象創建一個static
持有者,或者,如果可能的話,在需要的地方注入(如果使用DI框架)值。
這是一件好事,讓他們在一個地方。屬性文件還是靜態類?屬性文件應該用於例如本土化。例如靜態類字符串常量。
對於我來說,這些方法之間的主要區別是可以在不更改代碼的情況下更改值。
對於靜態final字段,您必須重新編譯源以使用新值。對於.properties文件,您通常必須重新啓動可能由系統管理員完成的應用程序。
所以它似乎是的問題,它應該是否可更改以及是否應該可用於某人一個開發者。(從某種意義上說這是一個問題,誰是「主管」這些值:開發人員或系統管理員/用戶等)
我最喜歡的方法是如下:
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命令行選項覆蓋屬性設置。
單例可能會比純靜態類更好;你可以將它與一個屬性文件結合起來,它可能是最好的方法。 – Viruzzo 2012-01-18 13:14:38
我會把他們扔進一個屬性文件中......當需要國際化時,這特別有用。 – mre 2012-01-18 13:15:11
爲什麼你想要一個全局配置文件?如果這些是常量,則不需要將它們在屬性文件中外化。如果這些常量被Foo類使用,那麼最好的地方是Foo類。 – 2012-01-18 13:15:44