Java中的魔法值解决
java中的魔法值
背景
使用idea时,启用了阿里的代码规范检查,其中就有一项提示是不允许任何魔法值出现在代码里,于是出于好奇就了解一下到底啥时魔法值。
介绍
魔法数值、魔法数字、魔法值,这是一个东西,不同的叫法。
魔法数字,在编程领域指的是莫名其妙出现的数字。数字的意义必须通过详细阅读才能推断出来
if("1".equals(dangerkey)){ bigdecimal warningvalue = new bigdecimal(jedisutils.get(warning_value_key)); model.addattribute("isdanger", true); model.addattribute("warningvalue", warningvalue); }
上面代码中的字符串1就是一个魔法值,在未读整段代码之前,我并不知道这个字符串1代表什么意思,只有把这个字符串带入后面的代码逻辑才能判断该值的真实意义,而且如果多次出现,这就大大的降低了代码的可阅读性。所以我们在代码中应该极力避免产生魔法值。
解决方法
** 使用枚举类型或者使用static final修饰常量 **
//预警值标识 public static final string dangerkey_true ="1"; if(dangerkey_true.equals(dangerkey)){ bigdecimal warningvalue = new bigdecimal(jedisutils.get(warning_value_key)); model.addattribute("isdanger", true); model.addattribute("warningvalue", warningvalue); }
以上就是使用static final的方式替换的魔法值,这样就可以避免了。如果在代码中多次使用的话,只需更声明的地方就可以达到全局的效果。
提示:静态常量的命名最好全是大写字母,如果是多个单词需要分割,可以使用下划线分割。
小结:魔法值的问题对于代码逻辑来说,并不是什么要命的事情,即使不修改也基本不影响代码的正常运行,我以前没有安装阿里代码检查规范时,一样这么使用,也没出现过啥问题。好吧,应该说但是了。但是,遵循公认的代码规范,可以有效的避免开发过程的一些小问题(最让人头疼的往往都是一些小问题引起的),提升开发的效率和代码的可阅读性,老老实实按照规范来,自然就会受益良多,继续加油!
java的魔法值概念
想象一下,当你入职一家新公司,打开工具看以前同事的项目时,突然看到下面这段代码
string[] catnames = new string[7]; string[] dognames = new string[7]; for(int i = 0; i < 7; i++) { //此处省略若干行 }
你心中一定很凌乱,可能还会在心底默默问候下写这段代码的前同事。
在没有注释的情况下,此处的i < 7,你根本无法知道是要处理 dognames数组还是catnames数组,你还要继续去看循环体中的内容才能来推断这个数字的含义。这里的7就是魔法值。
所谓的魔法值,就是指在代码中直接出现的数值,只有在这个数值记述的那部分代码中才能明确了解其含义。
魔法值简单好用,任何项目基本上都会有魔法值的出现。但魔法值就像一段没有注释的代码,它的出现使得程序的可读性大大下降,甚至只有当事人才知道。这对于项目或者别的开发来说,无疑都是不利的。同时,如果到处用到魔法值,那需要修改的时候,就要修改很多地方,这不仅耗费时间,还很容易会遗漏。
魔法值的问题就是含义不明且无法统一使用,要把它们统一表示,并加上注释,我们可以用static final 定义常量或使用enum值。
static final int cat_num = 7; string[] catnames = new string[cat_num]; for(int i = 0; i < cat_num; i++) { //此处省略若干行 } for(int i = 0; i < pet.dog.getnum(); i++) { //此处省略若干行 }
当然此处用catnames.length,dognames.length也不会引起混淆。
其实魔法值也并不是要完全禁止不用,毕竟每次用到数值就要去定义常量或者在enum中新增元素还是很麻烦的。只要保障你的数值不会让别人难以阅读,你就可以使用魔法值。一般 -1、0 和 1不被视为魔法值。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇: vbscript基础篇 - vbs数组Array的定义与使用方法
下一篇: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool
推荐阅读
-
JAVA中的NIO (New IO)
-
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
-
荐 Java中的螺丝屑
-
Win8自带浏览器IE10中flash无法正常播放的解决方法
-
Tomcat中应用调用Libvirt库进行控制时可能导致线程卡死问题的解决方法
-
Win7系统打开网页提示应用程序已被JAVA安全阻止的解决方法
-
thinkphp中session和cookie无效的解决方法
-
php中http与https跨域共享session的解决方法
-
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
-
Vue2.x中利用@font-size引入字体图标报错的解决方法