如何从数据库或servlet上下文中最好地初始化常量?

时间:2009-04-20 16:18:55

标签: java database servlets initialization constants

我们在应用程序的接口中声明了常量,就像这样。

public interface IConstants
{
    public static final String FEVER="6";
    public static final String HEADACHE="8";
}

我们现在想要从数据库(或应用程序servlet上下文)填充这些常量值(6和8)。

存储在查找表中的数据库值已在应用程序会话中可用(在servlet上下文属性中),因此我不必每次都进行数据库调用。

我们如何做到这一点?

5 个答案:

答案 0 :(得分:4)

鉴于您不想过多地更改现有代码,最简单的方法是:

public interface IConstants {
    public static final String FEVER = getConstFromDatabase("FEVER");
    public static final String HEADACHE = getConstFromDatabase("HEADACHE");
}

答案 1 :(得分:1)

由于常量值保留在数据库中,因此最好的方法是创建枚举类型并通过它使它们可用。

答案 2 :(得分:1)

你确定需要吗?!

如果您在添加新疾病时需要添加新代码,那么将“常量”设置为数据驱动的静态(非最终)全局变量几乎没有意义。 (这只会让事情复杂化。)

  • 如果您担心数据库和代码不匹配,可以在启动应用程序时验证数据库和常量是否匹配。你有一个表中定义的疾病,并使用某种参照完整性吗?

  • 如果您认为您需要数据驱动的方法,您可能根本不需要任何“已知疾病”字段,因为代码不应该真正依赖于那些。在这种情况下,每种疾病都应该是具有身份和其他特性的适当对象。

  • 如果您需要对某些类型进行特殊处理,您可能应该再次回到枚举...

  • 如果您患有许多疾病(可能是动态添加的)并且只有少数几种类型 - 同一代码以相同的方式处理多种疾病;在疾病表和代码中添加一个类型作为疾病类型的枚举(或常量),并使用它来运行不同的逻辑。

  • 如果每种疾病实际上都有很多复杂性,那么尝试为每种疾病编写一个类别可能是个好主意。 (然后你可以用子类和所有......做适当的O / R事情。)

从java 5开始,界面enum cludge不是必需的,因为你可以得到两个枚举 如果需要,可以进行静态导入。

(当使用枚举时,验证数据库更简单,因为你可以免费获得枚举。)

您的字段可能位于名为Disease或SickDude的类中,而不是位于巨大的全局常量类中。 (例如,日历中的字段)。可能作为他们“所属”的班级内部公共场所。

答案 3 :(得分:0)

作为常量,你不能轻易。

使用这些成员创建一个类,保护setter(或从构造函数中设置它们)并提供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。因为它们是静态的,所以只有一个值;既然你只有吸气剂,而且它们是私人的,没有人可以重置它们;因为他们是最终的,所以没有人能够继承你的背后。

答案 4 :(得分:0)

要使它们根据数据源而变化,您需要某种数据结构。

您可以定义一个bean来保存值(带有getter / setter的字段),或者使用map来表示值。

您应该将此视为配置问题,而不是常量问题。从编程的角度来看,常量确实是有意的。