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

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

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

答案取决于……

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

这两个方法都很好:

  1. 有一个带有必需final字段的静态类。

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

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

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

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

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

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

请参阅我的这篇关于依赖于环境的属性的文章。

然后,您可以为Properties / Configuration / …对象创建一个static holder,或者,如果可能的话,在任何需要的地方注入(如果使用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命令行选项覆盖属性设置。

把它们放在一个地方是件好事。 属性文件还是静态类? 属性文件应该用于例如本地化。 用于例如String常量的静态类。