java中的过滤属性

时间:2011-06-28 19:51:36

标签: java properties

我有一个使用少量.properties文件的java程序。它根据在运行时传递的参数(模式)选择要使用的属性文件。 例如,当程序在模式下运行时:它使用 a.properties 文件,当模式:b它将使用 b.properties 档案等 我想将所有这些属性文件合并到一个common.properties中,而不是具有不同的命名空间。例如,在common.properties中,我将:

a.url = aaa
a.ip = aaa.aaa.aaa.aaa
b.url = bbb
b.ip = bbb.bbb.bbb.bbb

现在,我在main方法中实例化属性对象,并将其传递给需要从属性中读取内容的其他对象/方法。但是现在我已经合并了我必须通过模式的属性:a或b,以便他们知道应该提取哪些属性集。 有没有更好的方法在main方法中创建属性文件的过滤实例,然后以这些对象不知道模式的方式将其传递给其他对象:a或b,并只查询url的属性对象和ip(不是a.url或a.ip)

2 个答案:

答案 0 :(得分:3)

不要将Properties对象传递给其他方法/对象。它太低级了,特别是现在你必须处理这个命名空间的事情。将属性封装在专用对象中(让我们称之为“配置”),并传递此配置对象。

public class Configuration {
    private String mode;
    private Properties properties;

    public Configuration(String mode, Properties properties) {
        this.mode = mode;
        this.properties = properties;
    }

    public String get(String key) {
        return properties.getString(mode + "." + key);
    }
}

您甚至可以将此Configuration对象的契约提取到一个接口中,并使所有对象依赖于此接口而不是具体的Configuration类,这将有助于

  • 如果您愿意,可以稍后更改配置策略(如果您从一开始就这样做了,那么现在不必更改所有对象中的任何内容)。
  • 在单元测试中模拟配置,使其返回您想要的内容。

答案 1 :(得分:0)

您可以扩展Properties类,为活动命名空间添加getter和setter,并覆盖get()方法以预先设置活动命名空间并调用super.get()方法。