用枚举类型实现Java中的常量
常量
在项目和程序中,经常有一些固定值,在程序运行期间是不变的。如全局的错误码、错误信息,服务器IP和端口,服务名称,系统状态码、项目日志路径等内容。
在java项目中,通常我们会定义一个常量类,并在类中将该固定值设置为静态不可变的数据。而这些常量之中,大部分至少要有两部分,即常量值和常量解释。比较典型的是错误信息这类常量,代码示例如下:
public class SysErrConstant {
public static final UNKNOWN_CODE = "ERR9999";
public static final UNKNOWN_MSG = "未知错误";
}
以这种方式定义常量,程序中在使用时可通过 类名.变量名 的形式调用。
log.info(SysErrConstant.UNKNOWN_CODE);
log.info(SysErrConstant.UNKNOWN_MSG);
采用这种方式定义常量,虽然能实现功能,但是很容易在这种常量类中出现数据位置混乱,常量值与解释无法对应,使用和定义比较繁琐等问题。
Java从1.5以后支持枚举类型,使用枚举类型可以有效解决以上问题,并且可以比较方便的供其他类引用。
使用枚举类型定义常量
我们使用枚举类对常量定义和使用的代码进行重新编写,代码如下:
public enum SysErrConstant {
UNKNOWN("ERR9999","未知错误");
private String code;
private String msg;
private SysErrConstant (String code, String msg) {
this.code = code;
this.msg = msg;
}
private SysErrConstant () {
}
public String code() {
return code;
}
public String msg(){
return msg;
}
}
log.info(SysErrConstant.UNKNOWN.code());
log.info(SysErrConstant.UNKNOWN.msg());
以这种形式定义常量,我们可以将常量的值与常量含义的解释对应起来;同时,由于我们在枚举类型定义时,将引用的方法名与枚举类型中的变量名进行了统一,所以我们不需要再关注每个常量值与常量解释定义的名称,只需要找到要使用的枚举类中对应的名称即可。
另外,我们还可以通过这种形式,将项目中有共性的“魔法数字”、“魔法变量”进行统一的归集,降低编码中出现的错误,增强我们系统的可靠性。
典型的例子,我们常用到的性别、民族、省市县名称等内容,在不同系统或者项目中,经常出现不同的表示方式,增加了很多系统交互之间的问题和成本。又比如在账务系统或会计系统中,我们可以将会计分录中借方、贷方,科目属性等内容用枚举类型处理,能够大大提高代码可读性和系统一致性,方便我们的开发。
/**
*
* 描述:记账时借方贷方标志(借方Dr 贷方Cr)
* @Version V1.0
*
*/
public enum JzDcInd{
Dr("借方","1"),Cr("贷方","2");
private String mean;
private String val;
private JzDcInd(String mean,String val) {
this.mean = mean;
this.val = val;
}
private JzDcInd() {
}
public String mean() {
return this.mean;
}
public String val() {
return this.val;
}
}
以上片段为账务系统中,借方贷方枚举类的示例代码,仅供参考。