使用属性文件而不是静态最终变量

时间:2012-01-18 13:12:26

标签: java configuration configuration-files

我有许多带有静态最终字段的类,它们用作默认值或配置。创建全局配置文件的最佳方法是什么?我应该将这些字段移动到单个静态类,使用属性文件还是什么?

编辑:我需要在java类和xhtml页面中使用这个值。价值观不依赖于环境。我可以编译项目来设置新值 - 没问题。

6 个答案:

答案 0 :(得分:20)

答案取决于......

  • 如果值根据运行时环境(例如数据库连接设置,外部服务器IP)而变化,或者可能会很快/很快发生变化,则将内容放入属性文件中
  • 希望尽可能使用enumstatic final常量(避免使用“字符串类型”代码)
  • 查找可能具有您想要的内容的现有库(例如,使用TimeUnit将小时数转换为秒数,而不是使用static final int SECONDS_IN_HOUR = 3600;
  • 剩下的内容(希望不会很快改变),在对其拥有“最多所有权”的班级中使用public static final
  • 避免使用具有返回常量的静态方法的类 - 它只是代码膨胀

答案 1 :(得分:1)

两种方法都很好:

  1. 拥有一个包含必填final字段的静态类。

  2. 有一个singelton但是可以适当地从多个线程中保存它。

  3. 如果可能,请在静态字段上使用enum。这样,您可以将相关字段组合在一起。

  4. 如果这些是应用程序级别值,我会更喜欢static类而不是singelton。

    并且,您应该决定这些是不时的const值或配置值。

答案 2 :(得分:1)

Y,es属性文件始终是配置的首选。有多种方法可以读取它,一种是apache commons-configuration。

如果属性是依赖于环境的,则将它们外部化(超出项目),并设置它们的路径(例如使用-Dconfig.location=..)。如果它们不根据环境而改变,只需将属性文件放在类路径上即可。

请参阅我的this article关于依赖环境的属性。

然后,您可以拥有static / Properties / ...对象的Configuration持有者,或者,如果可能的话,注入(如果使用DI框架)值的任何地方他们是必需的。

答案 3 :(得分:1)

就我而言,这些方法之间的主要区别在于能够在不更改代码的情况下更改值。

对于静态最终字段,您必须重新编译源以使用新值。使用.properties文件,您通常必须重新启动可由系统管理员等完成的应用程序。

所以它似乎是是否应该是可更改的问题以及它是否应该适用于除开发人员以外的其他人。(在某种意义上,这是一个“负责”的问题“这些价值观:开发人员或系统管理员/用户等。”

答案 4 :(得分: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命令行选项覆盖属性设置。

答案 5 :(得分:0)

将它们放在一个地方是件好事。属性文件还是静态类?属性文件应该用于例如本土化。例如静态类字符串常量。