Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何最好地从数据库或servlet上下文初始化常量?_Java_Database_Servlets_Initialization_Constants - Fatal编程技术网

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

Java 如何最好地从数据库或servlet上下文初始化常量?,java,database,servlets,initialization,constants,Java,Database,Servlets,Initialization,Constants,我们在应用程序的接口中声明了如下常量 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="6";
    public static final String HEADACHE="8";
}
现在,我们希望从数据库(或应用程序servlet上下文)填充这些常量值(6和8)

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

我们如何做到这一点呢?

作为常量,您不可能轻易做到

使用这些成员创建一个类,保护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; }
}

现在,当你构建这个类时,你会引起发烧和头痛。因为它们是静态的,所以只有一个值;由于您只有getter,而且它们是私有的,因此没有人可以重置它们;因为它们是最终的,没有人可以偷偷地在你背后继承。

因为常量值是持久存在于数据库中的,最好的方法是创建一个枚举类型并通过它使它们可用。

要使它们随数据源的不同而变化,你需要为它们提供某种数据结构

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


您可能应该认为这更像是一个配置问题,而不是一个常量问题。常量实际上是从编程的角度考虑的。

您确定需要吗

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

  • 如果担心数据库和代码不匹配,可以在启动应用程序时验证数据库和常量是否匹配。您已经在一个表中定义了疾病,并且正在使用某种引用完整性,对吗

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

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

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

  • 如果每种疾病实际上都很复杂,那么尝试为每种疾病编写一个类可能是一个好主意。 (然后可以对子类和所有…)执行适当的O/R操作)

自从Java5以来,接口enum clude不是必需的,因为您可以同时获得两个enum 如果需要,请执行静态导入

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


字段应该位于一个名为Disease或SickDude的类中,而不是一个巨大的全局常量类。(例如,与日历中的字段类似)。可能作为类中它们“所属”的内部公共枚举。

鉴于您不想对现有代码进行太多更改,最简单的方法是:

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

对不起,我没弄明白。查理·马丁:你不能在构造函数中设置一个静态的最终常量。您必须使用静态初始值设定项。非常感谢您的详细解释。不幸的是,我只能在界面上工作。我们无法更改应用程序的设计。它已经是活的了。到目前为止,并没有必要从数据库中分配contant值。我们只是在界面中硬编码了它们。但现在他们想从数据库中获取它们。@mm-Duh,你说得对。咖啡太少了。我会弄明白并测试它。使用接口作为常量的方便持有者是一种反模式。接口用于定义行为。请参阅“有效Java”,第19项。谢谢。但我们还没有到改变应用程序设计的阶段。它已经是活的了。到目前为止,并没有必要从数据库中分配contant值。我们只是在界面中硬编码了它们。但现在他们想从数据库中获取它们。任何建议都是有益的。谢谢你是说没有接口?事实上,我们还没有到改变应用程序设计的阶段,因为它已经上线了。接口存在,我们需要找到保持接口完整的解决方案。到目前为止,并没有必要从数据库中分配contant值。我们只是在界面中硬编码了它们。但现在他们想从数据库中获取它们。任何建议都是有帮助的,所以。。。您建议让类加载器访问数据库。