代码之家  ›  专栏  ›  技术社区  ›  Glenn Nelson

加载设置-最佳实践

  •  17
  • Glenn Nelson  · 技术社区  · 14 年前

    我在第一个真正的应用程序中加入了用户设置。我使用Java和非常面向对象(并试图保持这种方式),下面是我的想法:

    1. 加载中的所有内容 main() 和 把它全部“传下去”给 所需对象(数组)
    2. 同上,但只要通过 包含数据的对象 线
    3. 加载每个单独设置为 需要在不同的类中。

    我了解每种方法的一些基本优缺点(即时间与大小),但我正在寻找一些外部输入,以了解它们过去成功使用过哪些实践。

    5 回复  |  直到 6 年前
        1
  •  4
  •   Isaac    14 年前

    因为配置/设置通常加载一次(在启动时;或者在程序运行时加载几次)。无论如何,我们不是在谈论一个非常频繁/耗时的过程),我更喜欢简单而不是高效。

    这排除了选项号(3)。配置加载将分散在各地。

    我不完全确定你名单中(1)和(2)的区别。(1)是指“传递谨慎的参数”还是(2)是指“传递包含整个配置的对象”?如果是这样,我宁愿(2)而不是(1)。

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

        2
  •  9
  •   cookincode andersoj    6 年前

    有人应该站出来支持所谓的Java标准 Preferences API …这是最近在 JDK6 . 编辑添加 ,因为作者似乎了解XML,所以 appropriate than before . 我认为您可以使用XML JUJU Properties 精神也应该带你去。

    与SO有关: Preferences API vs. Apache solution , Is a master preferences class a good idea?

    (好吧,这就是我所愿意做的一切。)

        3
  •  7
  •   mtreit    14 年前

    使用settingsManager类或类似的类来抽象获取所有设置数据。在代码中需要设置的每一点上,您都会查询settingsManager类-类似于:

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

    然后,为如何将设置提取到此单个管理器类委托所有逻辑,您可以根据需要更改/优化这些管理器类的实现。例如,您可以实现settingsManager从配置文件、数据库或其他一些数据存储中获取设置,定期刷新设置,处理检索成本高昂的设置的缓存等。使用这些设置的代码仍然幸福地不知道所有这些实现决策。

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

    在.NET中,有一组相当丰富的现有配置类(在system.configuration中)命名空间提供了这类东西,并且效果非常好。

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

        4
  •  3
  •   Joseph Weissman    14 年前

    Here is a tutorial on the Properties class . 来自javadocs( Properties ):

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

    属性列表可以包含另一个 属性列表作为其“默认值”;这 搜索第二个属性列表,如果 在中找不到属性键 原始属性列表。

    本教程给出了以下典型用法的示例实例化:

        . . .
    // 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解析器,相当直接地滚动您自己的系统。祝你好运!

        5
  •  1
  •   Thorbjørn Ravn Andersen    14 年前

    我们最近开始使用JSR-330依赖项注入(使用SVN中的guice),发现可以读取属性文件(或任何其他映射)并在启动代码中的模块guice中绑定它,以便

    @Inject @Named("key") String value
    

    当调用特定代码时,字符串被注入与键对应的值。这是我见过的解决这个问题的最优雅的方式!

    您不必在代码周围拖拽配置对象,也不必在代码的每一个角落都洒上各种神奇的方法调用来获取值——您只需提到您需要它,它就在那里。

    注意:我已经看过Guice、Weld(Seam-Based)和Spring,它们都提供了注入,因为我们希望JSR-330在我们自己的代码中,而且我目前最喜欢Guice。我认为原因是因为Guice在其绑定中是最清晰的,而不是与Weld一起发生在引擎盖下的魔法。