[英]How can I best initialize constants from a database or servlet context?
我們在應用程序的接口中聲明了這樣的常量。
public interface IConstants
{
public static final String FEVER="6";
public static final String HEADACHE="8";
}
現在,我們想從數據庫(或應用程序servlet上下文)中填充這些常量值(6和8)。
查找表中存儲的數據庫值已在應用程序會話中(在servlet上下文屬性中)可用,因此我不必每次都進行數據庫調用。
我們如何做到這一點?
鑒於您不想過多更改現有代碼,最簡單的方法是:
public interface IConstants {
public static final String FEVER = getConstFromDatabase("FEVER");
public static final String HEADACHE = getConstFromDatabase("HEADACHE");
}
由於常量值保存在數據庫中,因此最好的方法是創建一個枚舉類型,並通過它進行使用。
您確定需要嗎?
如果在添加新疾病時仍需要添加新代碼,則使“常量”成為數據驅動的靜態(非最終)全局變量毫無意義。 (這只會使事情復雜化。)
如果您擔心數據庫和代碼之間的不匹配,可以在啟動應用程序時驗證數據庫和常量是否匹配。 您在表中定義了疾病,並且正在使用某種參照完整性嗎?
如果您確實認為您需要數據驅動的方法,那么您可能根本不需要“已知疾病”的任何字段,因為代碼不應真正依賴於這些字段。 在那種情況下,每種疾病都應該是具有身份和其他特性的適當對象。
如果您需要對某些類型進行特殊處理,則可能應再次返回枚舉...
相反,如果您有很多疾病(可以動態添加)並且只有幾種類型-幾種疾病通過相同的代碼以相同的方式處理; 在疾病表和代碼中添加一個類型作為疾病類型的枚舉(或常量),並使用它來運行不同的邏輯。
如果每種疾病實際上都有很多復雜性,那么嘗試為每種疾病編寫一個類可能是一個好主意。 (然后,您可以對子類和所有子類執行適當的O / R操作)。
自Java 5以來,接口枚舉類不再是必需的,因為您可以同時獲取兩個枚舉並進行靜態導入。
(並且在使用枚舉時,由於免費獲得枚舉,因此驗證數據庫更簡單。)
您的字段可能應該位於一個稱為Disease或SickDude的類中,而不是一個巨大的全局常量類。 (例如,“日歷”中的字段)。 可能作為他們“所屬”類中的內部公共枚舉。
作為常量 ,您不容易。
用這些成員創建一個類,保護設置器(或從構造函數中設置它們)並提供getter方法。
更多詳情:
首先,您不能輕易地從數據庫中初始化常量,因為必須在定義常量時對其進行初始化。
而是創建一個類似以下的類:
public class Constants {
private static final String FEVER ;
private static final String HEADACHE ;
public Constants(String fever, String headache){
if(FEVER == null){
FEVER = fever;
HEADACHE = headache;
} else {
// Do something; shouldn't be resetting these.
}
}
public String getFever(){ return FEVER; }
public String getHeadache(){ return HEADACHE; }
}
現在,當您構造類時,可以設置FEVER和HEADACHE。 由於它們是靜態的,因此只有一個值。 由於您只有吸氣劑而且它們是私人的,因此沒有人可以重置它們。 而且由於它們是最終的,因此沒有人可以通過繼承偷偷溜走。
為了使它們根據數據源而變化,您需要為它們提供某種數據結構。
您可以定義一個bean來保存值(帶有getters / setter的字段),或為值使用映射。
您可能應該認為這更像是配置問題,而不是常量問題。 從編程的角度來看,常量確實是要使用的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.