簡體   English   中英

替代單例實用程序類

[英]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調用。 此類存在許多問題:

  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僅ONCE類中具有靈活性。 為此,在我的項目中只需配置HBase .properties文件的位置/內容即可。 我當時想讓Singleton滿足這個要求是過大的。
  2. 我的要求還有哪些其他更好的方法(如上所述)?

謝謝!

注意:我已經閱讀了這個 StackOverflow討論,但是現在讓我更加困惑。

您應該避免使用所有靜態方法,而應該設計一個沒有強制其生命周期的類:它可以是帶有公共構造函數的典型不可變POJO。

然后,當您需要將其作為單例時,請將其用作單例。 為了進行測試,請以其他方式使用它。

通常,依賴項注入是解決這些問題的首選途徑:您無需將硬編碼用於配置對象的拉取機制,而是將對象傳遞給需要它的任何類。 然后,您可以決定遲交什么豆。

由於您可能不使用Spring(否則將使用默認的依賴注入),因此請考慮使用Guice,這是一種非常輕巧且非侵入式的依賴注入方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM