Java将配置元素暴露给程序

时间:2015-09-21 18:57:12

标签: java config

首先,让我说我真的不确定这是一个SO问题还是程序员SE问题,我从这里开始,因为这个社区更加活跃。

我有一个存储在java属性文件中的配置文件:

java_config=something
java_another=something else

我有一个控制此配置构建的枚举:

public enum ConfigFactory {
    INSTANCE;

    private Map<String, String> mSettings = new HashMap<String, String>();

    public void build(String path) {
        // load config file into mSettings, 
        // where the property k/v are stored in the hashmap as a k/v
    }
}

我想弄清楚的是将k / v暴露给系统的“最佳”方式是什么。解决方案很简单:

  1. 在整个计划中使用java_confgjava_another,或
  2. 创建一个final String var,间接引用(不是反映)java_config
  3. 解决方案#1:

    /**
     * addendum to ConfigFactory
     */
    public String getValue(String s) {
        // return value from key
    }
    /** end of addendum to ConfigFactory **/
    
    /**
     * Invoked somewhere in the program
     */
    ConfigFactory.Instance.getValue("java_config");
    

    但如果配置的密钥发生变化,使用上述方法需要进行大量更改。这正是我想要避免的。但它非常快,ConfigFactory将具有“更小”的堆内存占用量(实际增益取决于声明的字符串数量),并且显而易见的是我在ConfigFactory中实际引用了哪个值。

    解决方案#2:

    /**
     * addendum to ConfigFactory
     */
     public static final String JAVA_CONFIG = "java_config";
     public static final String JAVA_ANOTHER = "java_another";
    
     public String getValue(String s) {
         // return value based on key from mSettings
     }
     /** end of addendum to ConfigFactory **/
    
    
     /**
      * Invoked somewhere in the program
      */
      // use of indirect reference to the "java_config" string literal
      ConfigFactory.INSTANCE.getValue(ConfigFactory.JAVA_CONFIG);
    

    这样可以保持ConfigFactory中包含的config属性,并删除对文字字符串名称的依赖( Solution 1 ),但现在ConfigFactory必须包含许多public static final String声明,使堆内存占用空间更大,并且没有明确清楚我实际引用的是什么键。

    我理解每种方法的优缺点。我不确定是否:

    1. 有一个比列出的两个更好的解决方案,
    2. 解决方案2 确实是一个“更好”的解决方案而不是解决方案1 ​​,或
    3. 用于配置的单例模式是最佳方法
    4. 虽然这个问题直接引用properties,但这个问题也适用于用于为Java程序建立基线的任何配置文件。

0 个答案:

没有答案