自从上次教表弟一些开发规范,其中有一个规范是不要定义魔法值,比如:
if(type == 1){
// 业务逻辑
}
这里的1就称作魔法值,我们无法知道1代表的是什么含义,会大大提高理解成本。正确的方式是声明枚举或者常量来赋予数字具体的业务含义。
但是表弟在实际开发中不知道什么时候用枚举,什么时候用常量。作为贴心的表哥当然是选择原谅他啊。对了,是原谅他的不懂,不是那个原谅哦。
其实表哥在实际开发中,用枚举跟常量时就一个原则:一个值用常量,多个值用枚举。如何理解呢?
知道如何选择常量和枚举之后,有一些小细节还是要注意的:
// 写法一
private Integer MAX_RETRY_COUNT = 5;
if(xxx < MAX_RETRY_COUNT){
// 重试
}
// 写法二
private Integer FIVE = 5;
if(xxx < FIVE){
// 重试
}
// 写法三
if(xxx < 5){
// 重试
}
基于上述场景有一种不好扩展的写法如下:
public class CommonContants{
public final static Integer MAX_RETRY_COUNT = 5;
}
public class UploadImageService{
if(xxx < CommonContants.MAX_RETRY_COUNT){
// 重新上传图片
}
}
public class PullGoodsInfoService{
if(xxx < CommonContants.MAX_RETRY_COUNT){
// 重新调用第三方接口
}
}
假设此时通过线上观察发现上传图片重试5次大面积不成功,此时要把重试次数提高到10,此时修改就会影响获取商品信息的逻辑了。
推荐写法如下:
public class UploadImageContants{
public final static Integer MAX_RETRY_COUNT = 5;
}
public class PullGoodsInfoContants{
public final static Integer MAX_RETRY_COUNT = 5;
}
public class UploadImageService{
if(xxx < UploadImageContants.MAX_RETRY_COUNT){
// 重新上传图片
}
}
public class PullGoodsInfoService{
if(xxx < PullGoodsInfoContants.MAX_RETRY_COUNT){
// 重新调用第三方接口
}
}
上传图片与获取图片信息是两个不同的业务,给不同的业务创建其常量类,分别在常量类中定义最大重试次数。