在Java中处理复杂配置的最佳方法

时间:2012-10-17 21:56:15

标签: java json configuration properties maintenance

所以我在Java中为Accumulo

构建各种索引和摄取类

但我的问题并没有直接关系。

我有一个属性文件,存储了一个很长的列表(比方说有二十几个并且正在增长)的关键字和数据库表名。

现在当我的主类被实例化时,我将所有这些属性读入其相关的String对象并在整个过程中使用它们。但是,其中一些项目需要传递下来,有时是大块,下到其他类。

我认为我的选择是

  1. 就像我现在一样,这似乎很糟糕,因为如果我以错误的顺序提交令牌,可能会发生各种各样的肮脏。
  2. 传递属性对象本身,让每个类处理实例化自己的字符串对象(如果在文件中添加或删除标记,将来很容易变得难以维护)。
  3. 将信息存储在一个JSON文件中,该文件作为一个特殊的类对象被读入,该对象被传递给需要从中提取一些信息的人(小的缺点是每个类都从表名创建表引用)根据需要,使用JSON可能有必要继续实例化所有表引用,以便类可以只请求引用,但是在不需要时会经常创建一些额外的引用。)
  4. 其他一些选项Java专家知道我不
  5. 我很担心这一点,因为过去我主要是嵌入式和小规模系统的C ++开发人员。这是我的第一个大型项目之一,所以我试图从一开始就做好事。我已经有了一堆书籍,包括设计模式,只是为了让我的脚湿透,但任何一般的编程实践知识库我都很乐意接受建议。

    我试图将这种概括化,以便其他人可以受益,但可能需要更多细节,请告诉我。

3 个答案:

答案 0 :(得分:0)

选项(2)似乎是一种很好的方法。

这种变体的一种变体是将主要Properties对象中的所有字符串提取到单独的Properties(或HashMap)对象中,可能基于元素名称的前缀。因此,类Foo获取名称前缀为foo.的所有属性,类Bar获取所有bar.xxx属性,依此类推。

这使属性在逻辑上(和物理上)保持独立的集合,并为给定的类提供它所需的那些属性。如果所有类都需要共享公共属性(可能是那些带有all.global.前缀的属性,或者根本没有前缀,那么可以将这些属性添加到每个单独的Properties对象中。

答案 1 :(得分:0)

您的复杂程度要求您直接处理java.util.Properties文件。

这是一个简单的对象,它应该根据您的需要进行扩展。我不建议将您的属性映射到Java对象,因为您最终会不断更改映射文件;你需要只有java.util.Map才能提供的完全灵活性。

顺便说一句,你需要这个,这听起来不正确。可能有一个全球设计问题需要在您的应用程序中重新考虑。

此外,json解决方案可能还不错,因为在分层树中构建属性可能有助于降低配置文件的复杂性,但我再次避免将json对象映射到Java对象,因为模型是主题经常改变(据我所知)。

您可能会尝试在配置属性之间找到“模式”,并尝试提取某些组织。一旦你猜到配置中内置了一些好的“业务对象”,就可以将配置减少到这些对象的数组。

JSON听起来很适合我。您的问题可以看作是“复杂配置”的原型,这种情况并不少见(想想maven中的pom.xml)。所以我认为你需要两件事:

  1. 在您的配置中提取一些组织
  2. 使用一些结构化配置格式(如JSON或XML)

答案 2 :(得分:0)

Commons Configuration有几项功能可以帮助您整理

  • 独立于源(属性文件,XML文件,数据库......)的配置数据
  • 分层属性
  • 声明和创建bean