一次性加载配置属性的设计模式? [英] Design Pattern for one-time loaded configuration properties?
问题描述
我经常遇到在内存中存储从文件系统上的文件加载的几个(可能是复杂的)配置设置的问题。
I'm often faced with the problem of storing, in memory, a few (possibly complex) configuration settings loaded from files on the filesystem. I'm wondering if there's a better way to architect a pattern to this problem, however, than what I've been using.
基本上,我目前的解决方案涉及到三个步骤。
Essentially, my current solution involves three steps.
-
建立单例。由于数据是持久的,并且保证不会通过应用程序的运行时间改变,所以应该只需要一个对象实例。
Build a singleton. Since data is persistent and guaranteed not to change through the runtime of the application, only one object instance should ever be needed.
使用getters公开数据。
Expose data with getters.
这样做的效果是很多我的代码看起来像这样:
MyConfiguration.getInstance()。getWeightOfBomb()
,这看起来很奇怪。
This has the effect that a lot of my code looks like this:
MyConfiguration.getInstance().getWeightOfBomb()
, which looks rather odd to me.
有更好的方式来处理这个更语义的方式吗?
Is there a better way to handle this in a more semantic fashion?
推荐答案
依赖注入。您不一定需要使用DI框架,例如 Spring 或 Guice ,但是你真的想避免使用单例丢弃你的代码。你仍然可以在实现中使用单例,但没有理由你的代码的其余部分需要知道它是一个单例。单元是单元测试和重构时的巨大痛苦。让你的代码引用一个接口。例如
Dependency Injection. You don't necessarily have to use a DI framework like Spring or Guice but you really want to avoid littering your code with singletons. You can still use a singleton in the implementation, but there is no reason the rest of your code needs to know that it is a singleton. Singletons are huge pain when unit testing and refactoring. Let your code reference an interface instead. e.g.,
interface MyConfig {
double getWeightOfBomb();
}
class SomeClass {
private MyConfig myConfig;
public void doSomething() {
myConfig.getWeightOfBomb();
}
}
class MyConfigImpl implements MyConfig {
public double getWeightOfBomb() {
return MyConfiguration.getInstance().getWeightOfBomb();
}
}
如果使用DI框架,以注入您的 MyConfig
实现。如果你不这样做,那么仍然具有所有好处的最简单的方法是做如下:
If you use a DI framework, just setup you classes to have your MyConfig
implementation injected. If you don't, then the laziest approach that still has all the benefits is to do something like:
class SomeClass {
private MyConfig myConfig = new MyConfigImpl();
}
真的取决于你。重要的是,你可以在每个实例的基础上替换 myConfig
,当你以后意识到你需要改变和/或单元测试的行为。
Really it's up to you. The important thing is that you can replace myConfig
on a per instance basis when you later realize that you need the behavior to vary and/or for unit testing.
这篇关于一次性加载配置属性的设计模式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!