Singleton Util类的替代品

时间:2014-07-19 06:22:39

标签: java design-patterns singleton global-state

所以我有一个这样的课程:

public class HBaseUtil {
    private final String fileName = "hbase.properties";
    private Configuration config;

    private HBaseUtil() {
       try {
         config = new PropertiesConfiguration(fileName);
       } catch (ConfigurationException e) {
         // some exception handling logging
       }
    }

    // now some getters pulling data out of the config object

    public static String getProperty(String fieldKeyName) {...}

    public static String getColumnFamily(String fieldName) {...}

    // ... some more getters

    // NO setters (thus making this a read-only class)
}

因此,基本上我自己有一个Singleton类,第一次使用它,设置一个配置对象,然后只是继续监听get调用。这个课有很多问题:

  1. 由于Singleton和配置文件之间的紧密耦合,单元测试HBaseUtil类中的静态方法变得困难。
  2. 我真正想要的是能够提供类的文件名/文件名+路径,以便它可以进入那里,从该文件中读取配置属性并将它们提供给传入的读取请求。这里有一个重要的注意事项:我需要这种灵活性,在每次JVM启动时仅指定属性文件ONCE ONCE。所以我当然不需要维持状态。
  3. 以下是我能够提出的: 我没有使用Singleton,而是使用所有静态方法的普通类,并且没有定义明确的构造函数。

    public class HBaseUtil {
        // directly start with getters
        public static String getProperty(Configuration config, String fieldKeyName) {...}
    
        public static String getColumnFamily(Configuration config, String fieldKeyName) {...}
    
        // ...and so on
    }
    

    然后,而不是在我的其他代码中使用类:

    HBaseUtil.getProperty(String fieldKeyName)
    

    我这样使用它:

    Configuration externalConfig = new PropertiesConfiguration("my-custom-hbase.properties");
    
    HbaseUtil.getProperty(externalConfig, fieldKeyName) 
    

    我的问题:

    1. 我是否正在思考正确的方向?我的要求是在每个JVM上只有ONCE的灵活性。所有需要在我的项目中配置的,都是HBase .properties文件的位置/内容。我在考虑让Singleton对这个要求有点过分。
    2. 我的要求有哪些更好的方法(如上所述)?
    3. 谢谢!

      注意:我已经阅读了this StackOverflow讨论,但现在它让我更加困惑。

1 个答案:

答案 0 :(得分:2)

你应该避免使用所有静态方法,而是设计一个不强制生命周期的类:它可以是一个带有公共构造函数的典型不可变POJO。

然后,当您需要它作为单身人士时,将其用作单身人士。对于测试,请以其他方式使用它。

通常,依赖注入是解决这些问题的首选途径:您可以将对象传递给任何需要它的类,而不是为配置对象硬编码 pull 机制。然后你可以决定你将提供什么样的豆。

由于您可能没有使用Spring(否则依赖注入将是您的默认设置),请考虑使用Guice,这是一种非常轻量级且非侵入性的依赖注入方法。