繁体   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