所以我有一个这样的课程:
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调用。这个课有很多问题:
以下是我能够提出的: 我没有使用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)
我的问题:
谢谢!
注意:我已经阅读了this StackOverflow讨论,但现在它让我更加困惑。
答案 0 :(得分:2)
你应该避免使用所有静态方法,而是设计一个不强制生命周期的类:它可以是一个带有公共构造函数的典型不可变POJO。
然后,当您需要它作为单身人士时,将其用作单身人士。对于测试,请以其他方式使用它。
通常,依赖注入是解决这些问题的首选途径:您可以将对象传递给任何需要它的类,而不是为配置对象硬编码 pull 机制。然后你可以决定你将提供什么样的豆。
由于您可能没有使用Spring(否则依赖注入将是您的默认设置),请考虑使用Guice,这是一种非常轻量级且非侵入性的依赖注入方法。