我有很多带有静态常量字段的类,这些常量字段被用作默认值或配置。创建全局配置文件的最佳方法是什么?我应该将这些字段移动到单个静态类中,使用属性文件还是其他方法?
编辑:我需要在Java类和XHTML页面中都使用这些值。这些值不依赖于环境。我可以编译项目以设置新值 - 没问题。
我有很多带有静态常量字段的类,这些常量字段被用作默认值或配置。创建全局配置文件的最佳方法是什么?我应该将这些字段移动到单个静态类中,使用属性文件还是其他方法?
编辑:我需要在Java类和XHTML页面中都使用这些值。这些值不依赖于环境。我可以编译项目以设置新值 - 没问题。
enum
而不是static final
常量(避免"stringly typed"代码)。TimeUnit
将小时转换为秒,而不是使用static final int SECONDS_IN_HOUR = 3600;
)。public static final
。两种方法都可以:
使用必需的final
字段的静态类。
使用单例模式,但要适当地保存它以避免多个线程的问题。
如果可能,使用enum
而不是静态字段。这样您可以将相关字段分组在一起。
如果这些是应用程序级别的值,则我更喜欢使用静态类而不是单例模式。
并且,您应该决定这些是常量值还是不断变化的配置值。
对于配置文件而言,是首选使用属性文件。有多种读取属性文件的方法,其中一种是使用Apache Commons-Configuration。
如果这些属性与环境有关,可以将它们外部化(在项目之外),并设置路径(例如使用-Dconfig.location=..
)。如果它们不会因为环境而改变,就直接将属性文件放在类路径下。
请参阅此篇文章,了解更多关于环境相关属性的信息。
接着,你可以拥有一个静态
持有者来存储Properties
、Configuration
或其他对象;或者,如果可能的话,可以使用依赖注入框架在需要时进行值的注入。
对我来说,这些方法的主要区别在于能否在不更改代码的情况下更改值。
使用静态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;
}
}
将它们放在一个地方是很好的。属性文件或静态类?属性文件应该用于例如本地化。静态类用于例如字符串常量。