0

所以我有这样的课:

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 启动时仅指定一次属性文件。所以我当然不需要维护状态。

这是我能想到的:我有一个普通类,其中包含所有静态方法且未定义显式构造函数,而不是 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 只在类中具有一次灵活性。为此,我的项目中需要配置的只是 HBase .properties 文件的位置/内容。我在想有一个单例对于这个要求来说是多余的。
  2. 对于我的要求,还有哪些更好的方法(如上所述)?

谢谢!

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

4

1 回答 1

2

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

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

通常,依赖注入是解决这些问题的首选途径:您无需为配置对象硬编码拉取机制,而是将对象交付给任何需要它的类。然后你可以决定迟交什么豆子。

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

于 2014-07-19T08:32:55.873 回答