什么是魔法值
魔法值就是指在代码中直接出现的数值,只有在这个数值记述的那部分代码中才能够明确了解它的含义。
影响
魔法值会使得代码的可读性下降。并且如果数值出现多次不能够明确说明这些数值的含义,在使用数值的时候也容易出现错误。
代码举例
//定义array数组
int [] array = new int[24];
//遍历array数组输出值
for (int i =0; i < 24; i++){
System.out.print(array[i]);
}
像上述的代码,如果定义数组部分的代码和for循环输出array数组代码相隔比较远,就很难知道for循环中的 i < 20是什么含义了。它究竟是数组的长度还是根据需求定义的界限值,很难搞清楚。
解决办法
根据魔法值的定义我们可以知道,魔法值其实就是“共识层面”的常量,而常量的使用范围经常是全类甚至是全局的,所以如果命名不合适就会出现阅读困难的问题,也就是魔法值,所以如果我们可以限制使用的范围,或者用一些标志性的常量来代替数值,那么问题就会很好的解决了。
使用static final 定义常量(不推荐)
如下代码修改:
//定义常量
static final int arrayLength= 24;
//定义array数组
int [] array = new int[arrayLength];
//遍历array数组输出值
for (int i =0; i < arrayLength; i++){
System.out.print(array[i]);
}
上边的代码将常量值用static final定义成变量,后边的for循环在使用这个常量的时候只需要将其替换成变量名即可,做出了很好的区分,以后只要是这个变量名,它的数值就是我们的常量值,也就是24。
同样,使用static final 声明常量,还可以方便以后的维护更新,修改变量的值只需要修改一处就可以了,不用担心出其他的错误:比如修改了不应该修改的地方
使用枚举类
//定义枚举类
public enum ArrayLengthEnum{
private int arrayLength;
ArrayLengthEnum(int arrayLength){
this.arrayLength = arrayLength;
}
public int getArrayLength(){
return arrayLength;
}
}
//定义array数组
int [] array = new int[ArrayLengthEnum(24).getArrayLength];
//遍历array数组输出值
for (int i =0; i < ArrayLengthEnum(24).getArrayLength; i++){
System.out.print(array[i]);
}
纠正魔法值带来的好处
1、望文生义,看到这个变量名就知道他的值是多少
2、常量值在后期的使用是能够做到值出同源