[英]Alternative To Singleton 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調用。 此類存在許多問題:
這是我能想到的:我有一個普通的類,其中包含所有靜態方法,並且未定義任何顯式構造函數,而不是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)
我的問題:
謝謝!
注意:我已經閱讀了這個 StackOverflow討論,但是現在讓我更加困惑。
您應該避免使用所有靜態方法,而應該設計一個沒有強制其生命周期的類:它可以是帶有公共構造函數的典型不可變POJO。
然后,當您需要將其作為單例時,請將其用作單例。 為了進行測試,請以其他方式使用它。
通常,依賴項注入是解決這些問題的首選途徑:您無需將硬編碼用於配置對象的拉取機制,而是將對象傳遞給需要它的任何類。 然后,您可以決定遲交什么豆。
由於您可能不使用Spring(否則將使用默認的依賴注入),因此請考慮使用Guice,這是一種非常輕巧且非侵入式的依賴注入方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.