簡體   English   中英

如何避免多次讀取屬性文件

[英]How to avoid reading property file multiple times

我們在屬性文件中有一些數據。 這些數據用於許多類。 因此,我們在每個類中創建一個Properties類對象,然后使用getProperty()方法讀取數據。 這導致代碼重復。

有人可以建議一些最佳做法來避免這種情況嗎?

我想到的一件事是:
創建一個類
為此類的屬性文件中的每個屬性設置一個公共變量
有一個方法可以為每個屬性分配值
在需要屬性值的類中,為此類創建一個對象並訪問公共變量

但是,我不喜歡這種方法的是公共變量,如果在屬性文件中添加了新屬性,我需要添加代碼來讀取類中的該屬性。

任何幫助表示贊賞。

謝謝!

您可以創建一個Singleton類,它在第一次調用時加載屬性..以及一個檢索給定屬性鍵的屬性值的公共方法。

這假設您正在使用標准屬性文件...但您可以將其推斷為任何鍵值對,將屬性類型更改為Map或其他內容。

就像是

public class PropertyHandler{

   private static PropertyHandler instance = null;

   private Properties props = null;

   private PropertyHandler(){
         // Here you could read the file into props object
         this.props = ..... 
   }

   public static synchronized PropertyHandler getInstance(){
       if (instance == null)
           instance = new PropertyHandler();
       return instance;
   }

   public String getValue(String propKey){
       return this.props.getProperty(propKey);
   }
}

然后你可以根據需要調用它..從任何代碼..像這樣。

String myValue = PropertyHandler.getInstance().getValue(propKey);

希望這可以幫助

對我來說靜態內部類是最好的方法。 它會懶惰地執行它,因為類加載是同步的,所以線程安全,還有性能。 因此,我們實現了三件事:

  1. 良好的表現,因為同步活力將受到影響,但在這里我們使用靜態內部類。
  2. 線程安全,因為當內部類將被加載時,只有map將被初始化,因為類加載是線程安全的,因此所有總線程安全。
  3. 當我們調用Singleton.initialize().get(key)時,將加載內部類,以便懶惰地初始化地圖。

以下是代碼......

public class SingletonFactory 
{   
    private static class Singleton
    {
        private static final Map<String, String> map = new HashMap<String, String>();
        static
        {
            try
            {
                //here we can read properties files
                map.put("KEY", "VALUE");
            }
            catch(Exception e)
            {
                //we can do the exception handling
                System.out.println(e);
            }
        }
        private static Map<String, String> initialize()
        {   
            return map;
        }
    }

    public static String getValue(String key)
    {
        return Singleton.initialize().get(key);
    }
}

一個開箱即用的選項是使用系統屬性 您可以將自己的系統屬性添加到執行環境中。

您可以使用具有靜態Properties對象的專用類來完成此操作。 請看這里的例子。

我可能會誤解你的數據流,但這對我來說似乎是“正常的”:

  • 創建一個readPropFile方法。
    • 這應該讀取一個文件並適當地解析它找到的屬性。
    • 這些屬性可以存儲在Map<String, Object> ,並按屬性名稱進行哈希處理。
  • 讀取屬性文件一次(可能是在應用程序啟動時,或者只要適合加載屬性) - > Properties對象(比如說, props )。
  • props傳遞給需要訪問這些屬性的任何東西。
    • 或者,如果您不想顯式傳遞它,請使用此處所示的靜態訪問器。
  • 使用props.get("PROPERTY_NAME")訪問屬性(只在內部Map查找該屬性)。
    • 如果您不想使用字符串查找,可以在某處保留有效屬性名稱的枚舉,並使用它進行存儲/查找,但是每次向文件添加新屬性時都必須更新該枚舉。

我已成功使用Enum,並在構造函數中使用name()方法讀取同名屬性。 確保以合理的方式處理異常,否則整個類將無法加載,您將不會收到有用的錯誤消息。

這種方法的好處是每個枚舉值自動對應一個屬性,而不必為每個屬性編寫單獨的映射代碼。 你當然需要每個屬性的枚舉值(如果你想要DRY prop引用那是不可避免的),但你要避免使用未經檢查的字符串重復的每個屬性初始化代碼。

缺點是枚舉不允許泛型類型,因此如果您希望某些屬性返回Integer而其他屬性返回String,那么使用經典的單例類設計可能會更好。

如果你想對此發瘋,你也可以編寫一個腳本來從屬性文件中生成你的Enum或singleton java源代碼,以使你的代碼更加干燥。

暫無
暫無

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

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