[英]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);
希望這可以幫助
對我來說靜態內部類是最好的方法。 它會懶惰地執行它,因為類加載是同步的,所以線程安全,還有性能。 因此,我們實現了三件事:
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.