使用属性文件代替静态final变量

11

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

编辑:我需要在Java类和XHTML页面中都使用这些值。这些值不依赖于环境。我可以编译项目以设置新值 - 没问题。


1
一个单例模式可能比一个纯静态类更好;你可以将其与属性文件结合使用,这可能是最好的方法。 - Viruzzo
我会把它们放进一个属性文件中...这在需要国际化时特别有用。 - mre
1
为什么要使用全局配置文件?如果这些是常量,就没有必要将它们外部化到属性文件中。而且如果这些常量被类Foo使用,最好的地方就是在类Foo中。 - JB Nizet
6个回答

20
答案取决于...
  • 如果值会根据运行时环境改变(例如数据库连接设置、外部服务器IP),或者很可能会经常/即将发生改变,请将内容放入属性文件中。
  • 尽可能使用enum而不是static final常量(避免"stringly typed"代码)。
  • 查找可能具有所需功能的现有库(例如使用TimeUnit将小时转换为秒,而不是使用static final int SECONDS_IN_HOUR = 3600;)。
  • 对于那些不希望在最近将来发生改变的内容,在拥有它们的类中使用public static final
  • 避免具有返回常量的静态方法的类- 这只是代码臃肿。

1

两种方法都可以:

  1. 使用必需的final字段的静态类。

  2. 使用单例模式,但要适当地保存它以避免多个线程的问题。

  3. 如果可能,使用enum而不是静态字段。这样您可以将相关字段分组在一起。

如果这些是应用程序级别的值,则我更喜欢使用静态类而不是单例模式。

并且,您应该决定这些是常量值还是不断变化的配置值。


1

对于配置文件而言,是首选使用属性文件。有多种读取属性文件的方法,其中一种是使用Apache Commons-Configuration。

如果这些属性与环境有关,可以将它们外部化(在项目之外),并设置路径(例如使用-Dconfig.location=..)。如果它们不会因为环境而改变,就直接将属性文件放在类路径下。

请参阅此篇文章,了解更多关于环境相关属性的信息。

接着,你可以拥有一个静态持有者来存储PropertiesConfiguration或其他对象;或者,如果可能的话,可以使用依赖注入框架在需要时进行值的注入。


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”命令行选项覆盖属性设置。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接