1.前语
重构老代码中遇到了不少相似下面这种写法:
publicvoidattend(Stringvalue){if(“0”.equals(value)){//todo}elseif(“1”.equals(value)){//todo}else{//todo}
}
脑壳疼!从Java语法上无懈可击,但是从事务上却让人无法了解其间0和1的含义它们统称为魔法值。关于上面的代码咱们往往需求经过上下文揣度出来逻辑,如果是非常复杂的事务或许10年前的代码那就更惨了,搞不好文档也没有。为了可读性,所以咱们要尽量防止出现魔法值。今日就来讲几种防止魔法值的操作。JAVA
2.防止魔法值的一些操作。
一般魔法值都是不常常变化的。关于魔法值的处理要结合事务和作用域。
2.1静态常量
如果该值的作用域在一个类中或许同一个包下,一般能够运用静态常量来解决。
privatestaticfinalStringFEMALE=”0″;privatestaticfinalStringMALE=”1″;publicvoidattend(Stringvalue){if(FEMALE.equals(value)){//todo}elseif(MALE.equals(value)){//todo}else{//todo}
}
这样是不是明晰了许多,本来0和1代表的是性别(当然需求合作你良好的变量命名习气)。
2.2运用接口
已然咱们运用了静态常量那么咱们能够将魔法值封装入接口也是能够的。
publicinterfaceGender{
StringFEMALE=”0″;
StringMALE=”1″;
}
2.3运用枚举
但是接口的含义在于提供抽象的功用而不是存储一些常量值,明显违反了接口规划的初衷。所以jdk1.5引入了枚举类型enum。
publicenumGenderEnum{
FEMALE,
MALE
}
许多情况这种写法就够用了,你能够经过GenderEnum.MALE.ordinal()获取对应枚举的数字序号,也能够经过GenderEnum.MALE.name()获取对应枚举的字符串称号。他们大多数情况下都能够用来进行一些逻辑标识。但是满足不了咱们上面开始的规划,咱们需求来改造一下枚举类的结构函数。
publicenumGenderEnum{
FEMALE(“0”),
MALE(“1”);privatefinalStringvalue;
GenderEnum(Stringvalue){this.value=value;
}publicStringvalue(){returnthis.value;
}
}
这样改写之后咱们就能经过value()方法拿到具体的值了。
咱们给自己再增加点需求,以到达你的枚举更加友爱的可读性。
//fromhttps://zzzjtd.com/rjkf/javajc
publicenumGenderEnum{
UNKNOWN(“-1″,”不知道”),
FEMALE(“0″,”女人”),
MALE(“1″,”男性”);privatefinalStringvalue;privatefinalStringdescription;
GenderEnum(Stringvalue,Stringdescription){this.value=value;this.description=description;
}publicStringvalue(){returnthis.value;
}publicStringdescription(){returnthis.description;
}
}
description值不但能够帮助咱们知道该枚举的实际代表含义,甚至能够作为一种阐明返回给前端事务。
小贴士:枚举尽量不要运用中文声明,如FEMALE直接声明为女人。别的枚举是单例的,因而无法运用clone和反序列化。
3.总结
今日咱们了解了怎么优雅处理编码中的魔法值,特别是枚举计划。希望对你有用。