加载设置 - 最佳实践

时间:2010-10-16 23:32:23

标签: java oop settings

我正处于第一个真正的应用程序中,我将添加用户设置。我正在使用Java并且非常OO(并试图保持这种方式)所以这是我的想法:

  1. 将所有内容加载到main()和 把它全部“下线”传递到 必需的对象(数组)
  2. 同上,但只是通过了 包含数据的对象 这条线
  3. 将每个设置加载为 在各个班级中都需要。
  4. 我理解每种方法的一些基本优缺点(即时间与大小),但我正在寻找一些外部输入,以了解他们过去成功使用的实践。

5 个答案:

答案 0 :(得分:9)

有人应该支持所谓的Java标准,Preferences API ......这是JDK6中的最新版本。 编辑添加,因为作者似乎精通XML,这更多是appropriate than before。我以为我相信你也可以和Properties一起使用XML juju,如果精神需要你的话。

与SO相关:Preferences API vs. Apache solutionIs a master preferences class a good idea?

(好吧,这就是我愿意做的所有站立。)

答案 1 :(得分:7)

使用SettingsManager类或类似的东西来抽象获取所有设置数据。在您需要设置的代码中的每个点,您都可以查询SettingsManager类 - 例如:

int timeout = SettingsManager.GetSetting("TimeoutSetting");

然后,您可以将设置的所有逻辑委派给此单个管理器类,您可以根据需要更改/优化其实现。例如,您可以实现SettingsManager从配置文件,数据库或其他一些数据存储中获取设置,定期刷新设置,处理昂贵的设置缓存等。使用设置的代码仍然幸福不知道所有这些实施决定。

为了获得最大的灵活性,您可以使用接口而不是实际的类,并且让不同的设置管理器实现接口:您可以根据需要在某个中心点交换它们,而无需根据需要更改基础代码。 / p>

在.NET中,有一组相当丰富的现有配置类(在System.Configuration中),这些命名空间提供了这种功能,并且运行良好。

我不确定Java等价物,但它是一个很好的模式。

答案 2 :(得分:4)

由于配置/设置通常只加载一次(在启动时;或者在程序运行期间可能会加载几次。无论如何,我们不是在谈论一个非常频繁/耗时的过程),我宁愿简单一些效率

排除选项编号(3)。配置加载将分散在各处。

我不完全确定列表中(1)和(2)之间的区别。 (1)是表示“传递谨慎的参数”,(2)是指“传递包含整个配置的对象”吗?如果是这样,我宁愿(2)超过(1)。

这里的经验法则是你应该保持简单和集中。在一个地方读取配置的优点是,如果配置源在某些时候发生变化,它可以提供更好的控制。

答案 3 :(得分:3)

Here is a tutorial on the Properties class。来自Javadocs(Properties):

  

Properties类表示一个   持久的属性集。该   属性可以保存到流或   从流中加载。每把钥匙及其   属性中的对应值   list是一个字符串。

     

属性列表可以包含另一个   属性列表为“默认值”;这个   搜索第二个属性列表是否   在找不到属性键   原始财产清单。

本教程为典型用法提供了以下示例实例:

    . . .
// create and load default properties
Properties defaultProps = new Properties();
FileInputStream in = new FileInputStream("defaultProperties");
defaultProps.load(in);
in.close();

// create application properties with default
Properties applicationProps = new Properties(defaultProps);

// now load properties from last invocation
in = new FileInputStream("appProperties");
applicationProps.load(in);
in.close();
. . .

当然,您也可以使用基于文件的存储和XML或YAML解析器直接滚动您自己的系统。祝你好运!

答案 4 :(得分:1)

我们最近开始使用JSR-330依赖注入(使用来自SVN的Guice)并发现可以读取属性文件(或任何其他地图)并将其绑定在启动代码中的模块内的Guice中,以便

@Inject @Named("key") String value
在调用特定代码时,

字符串注入了与键对应的值。这是我见过解决这个问题最优雅的方式!

您不必在代码周围运行配置对象,也不必在代码的每个角落撒上各种魔术方法调用来获取值 - 您只需向Guice提及您需要它,它就在那里。

注意:我已经看过Guice,Weld(基于Seam)和Spring都提供注入,因为我们在自己的代码中需要JSR-330,而且我最喜欢Guice。我认为原因是因为Guice在其绑定中是最明显的,而不是与Weld发生的引擎盖下的魔术。