簡體   English   中英

如何最好地從數據庫或Servlet上下文初始化常量?

[英]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.

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