我正处于第一个真正的应用程序中,我将添加用户设置。我正在使用Java并且非常OO(并试图保持这种方式)所以这是我的想法:
main()
和
把它全部“下线”传递到
必需的对象(数组)我理解每种方法的一些基本优缺点(即时间与大小),但我正在寻找一些外部输入,以了解他们过去成功使用的实践。
答案 0 :(得分:9)
有人应该支持所谓的Java标准,Preferences API ......这是JDK6中的最新版本。 编辑添加,因为作者似乎精通XML,这更多是appropriate than before。我以为我相信你也可以和Properties
一起使用XML juju,如果精神需要你的话。
与SO相关:Preferences API vs. Apache solution,Is 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发生的引擎盖下的魔术。