我们在应用程序的接口中声明了常量,就像这样。
public interface IConstants
{
public static final String FEVER="6";
public static final String HEADACHE="8";
}
我们现在想要从数据库(或应用程序servlet上下文)填充这些常量值(6和8)。
存储在查找表中的数据库值已在应用程序会话中可用(在servlet上下文属性中),因此我不必每次都进行数据库调用。
我们如何做到这一点?
答案 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来表示值。
您应该将此视为配置问题,而不是常量问题。从编程的角度来看,常量确实是有意的。