Альтернатива Синглтон Util Class
Итак, у меня есть такой класс:
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. Есть несколько проблем с этим классом:
- Модульное тестирование статических методов в классе HBaseUtil становится сложным из-за тесной связи между Singleton и файлом конфигурации.
- Что я действительно хочу, так это то, что я могу указать имя файла / имя файла + путь к классу, чтобы он мог туда войти, прочитать свойства конфигурации из этого файла и предложить их для входящих запросов на чтение. Здесь есть одно важное замечание: мне нужна эта гибкость при указании файла свойств ТОЛЬКО ОДИН РАЗ за запуск 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)
Мои вопросы:
- Я даже думаю в правильном направлении? Мое требование - иметь гибкость в классе только ОДИН РАЗ на JVM. Для этого все, что нужно настроить в моем проекте, это расположение / содержимое файла HBase .properties. Я думал, что синглтон - это слишком много для этого требования.
- Какие еще лучшие подходы существуют для моего требования (указано в пункте выше)?
Спасибо!
Примечание: я читал это обсуждение Stackru, но теперь оно меня еще больше запутало.
1 ответ
Вам следует избегать всех статических методов и вместо этого проектировать класс, который не требует его жизненного цикла: это может быть типичный неизменяемый POJO с открытым конструктором.
Затем, когда вам это нужно как синглтон, используйте его как синглтон. Для тестирования используйте его другим способом.
Обычно внедрение зависимости является предпочтительным способом решения этих проблем: вместо жесткого кодирования механизма извлечения для вашего объекта конфигурации у вас есть объект, доставленный любому классу, который в этом нуждается. Тогда вы можете поздно решить, какой боб вы доставите.
Поскольку вы, вероятно, не используете Spring (иначе внедрение зависимостей будет вашим выбором по умолчанию), рассмотрите возможность использования Guice, который является очень легковесным и ненавязчивым подходом к внедрению зависимостей.