簡體   English   中英

使用屬性文件而不是靜態最終變量

[英]Use properties file instead of static final variables

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

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

答案取決於......

  • 如果值根據運行時環境(例如數據庫連接設置,外部服務器IP)而改變,或者可能經常/很快改變,則將內容放入屬性文件中
  • 首選盡可能使用enumstatic final常量(避免使用“字符串類型”代碼)
  • 查找可能具有所需內容的現有庫(例如,使用TimeUnit將小時轉換為秒,而不是使用static final int SECONDS_IN_HOUR = 3600;
  • 還剩下什么(希望不會很快改變),在擁有“最多所有權”的班級中使用public static final
  • 避免使用具有返回常量的靜態方法的類 - 它只是代碼膨脹

這兩個方法都很好:

  1. 有一個帶有必需final字段的靜態類。

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

  3. 如果可能的話,在靜態字段上使用enum 這樣,您可以將相關字段組合在一起。

如果這些是應用程序級別值,我寧願選擇static類而不是singelton。

並且,您應該確定這些是不同的const值或配置值。

Y,es屬性文件始終是配置的首選。 有多種方法可以讀取它,一種是apache commons-configuration。

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

請參閱我的這篇關於依賴於環境的屬性的文章。

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

至於我,這些方法之間的主要區別在於能夠在不更改代碼的情況下更改值。

對於靜態最終字段,您必須重新編譯源以使用新值。 使用.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命令行選項覆蓋屬性設置。

將它們放在一個地方是件好事。 屬性文件還是靜態類? 屬性文件應該用於例如本地化。 用於例如String常量的靜態類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM