我正在开发我的第一个真正应用程序,并正在添加用户设置功能。我使用Java编程,并且非常注重面向对象的编程方式,以下是我的想法:
- 在
main()
中加载所有内容,然后将其通过“传递给所需对象”的方式传递到下一级(数组)。 - 与上述方法相同,但仅传递包含数据的对象到下一级。
- 按需要在各个类中单独加载每个设置选项。
我了解每种方法的基本优缺点(例如时间与空间),但我希望得到外部意见,以获得成功过的最佳做法。
Properties
也可以实现XML魔法。有关问题,请参见SO:Preferences API与Apache解决方案、主要首选项类是否是个好主意?(好吧,这就是我愿意站出来说的全部内容了。)int timeout = SettingsManager.GetSetting("TimeoutSetting");
这里有一个关于Properties类的教程。从Javadocs (Properties)得知:
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解析器来直接构建自己的系统。祝好运!
由于配置/设置通常只会在启动时加载一次(或者在程序运行期间多次加载几次。无论如何,我们不讨论非常频繁/耗时的过程),我更喜欢简单而不是高效。
这排除了选项(3)。配置加载将散布在各个地方。
我不完全确定您列表中(1)和(2)之间的区别。 (1)是否意味着“传递离散参数”,而(2)是否意味着“传递包含整个配置的对象”?如果是这样,我更喜欢(2)而不是(1)。
原则是保持简单和集中。在一个地方读取配置的优点是,如果配置源在某些时候发生更改,它将为您提供更好的控制。
@Inject @Named("key") String value
当特定代码被调用时,字符串将注入与键对应的值。这是我见过解决此问题最优雅的方式!
您不必在代码中传递配置对象或在每个角落撒上各种魔法方法调用来获取值 - 您只需告诉Guice您需要它,它就会出现。
注意:我们查看了提供注入的Guice、Weld(基于Seam)和Spring,因为我们想要在自己的代码中使用JSR-330,并且我目前最喜欢Guice。我认为原因是Guice在其绑定方面最清晰,而Weld则在幕后发生了一些神奇的事情。
Preferences
API、Jakarta的commons-configuration
等);他在询问一种方法——从他的问题中可以看出,他更关心方法和设计而不是特定的实现。有趣的是,这个问题的大多数答案都与读取设置的特定实现有关,而不是设计。我们是否忽略了Glenn的观点? - Isaac