【问题标题】:Java properties: best practices?Java 属性:最佳实践?
【发布时间】:2015-01-20 17:01:46
【问题描述】:

场景:应用程序有一个可以启用一些优化的算法。默认情况下,有些是打开的,有些是关闭的。有没有一种方便的方法可以在 Java 中实现某种全局属性系统?

要求:

  • 必须很容易两个使用不同设置运行程序的多个实例
  • 可从每个类访问(尽可能不传递任何对象)
  • 可通过命令行参数设置,例如-DenableOptimizationX
  • “标准”方式/用户易于理解

替代方案:

这些(或其他)中的哪一个似乎是这种情况的最佳解决方案?

【问题讨论】:

  • 它应该可以从任何地方访问的事实是,IMO,一个设计问题的标志。如果参数是针对特定算法的,为什么所有其他类都必须访问这些属性?
  • @JBNizet 我想要一种简单的方法来获取算法的属性。您对更好的设计有什么建议吗?对于这种场景,您将如何实现通用属性系统?

标签: java application-settings properties-file


【解决方案1】:
  1. 将属性保存在 .prop 文件中。我认为这比命令行参数更好,因为
  1. 它可以很容易地查看正在使用的所有属性。
  2. 它们的当前值是多少,
  3. 每个部署环境都可以有自己的属性值(例如 qa、prod)
  4. 您可以对不同文件中的属性进行逻辑分组。
  1. 创建一个类 PropertyFactory。有一个私有静态最终成员propertiesMap。在静态块中的此类中,使用所有属性文件中的值初始化 propertiesMap。 您现在可以在代码中的任何位置使用propertiesMap
  2. 为了方便最终用户,您可以为用户提供一个更多选项以在命令行参数中指定属性值。在你的静态块中,处理它。如果用户为某些属性提供了值,则在地图中覆盖。
  3. 你可以访问它

    PropertiesFactory.getPropertiesMap().get("key");

更新

  1. 您希望在运行时更改值。但这对于 vm 参数/命令行参数/系统环境是不可能的。一旦程序执行开始,这些值就固定了。所以这在独立的 Java 应用程序中是不可能的。

如果您希望值能够更新,那么 propertiesMap 需要是可变的。您需要在服务器上运行此程序,其中维护 propertiesMap 的实例,并且当您想要覆盖其键之一的值时,您可以将方法放在此映射上。

【讨论】:

  • 所以您可以使用PropertyFactory.getProperties().getProperty("foo"); 访问它吗?但是,如果您在运行程序时想快速更改它怎么办?例如以不同的设置并行运行算法?我会将此添加到我的要求中。
  • 我的意思是我想用不同的参数运行程序的多个实例,这是可能的,但是有什么好的方法呢?
  • 您可以使用@Pranalee 的解决方案,但将属性存储在“地图地图”中。 (通过PropertyFactory.getProperties("ProgramInstanceXY").getProperty("foo"); 访问属性)。尽管如此,我还是强烈建议传递属性而不是静态访问它们。
  • 如果您有一组固定的实例正在运行,您可以为每个实例设置属性文件。或者您可以允许用户从命令行参数传递文件名。
  • @slartidan 为什么传递它们而不是静态访问通常更好?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多