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操作)
字段应该位于一个名为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值。我们只是在界面中硬编码了它们。但现在他们想从数据库中获取它们。任何建议都是有帮助的,所以。。。您建议让类加载器访问数据库。