Java中的魔法值解决

 更新时间:2022年01月29日 08:39:45   作者:shenzhou_yh  
这篇文章主要介绍了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不被视为魔法值。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解读CommandLineRunner或者ApplicationRunner接口

    解读CommandLineRunner或者ApplicationRunner接口

    这篇文章主要介绍了解读CommandLineRunner或者ApplicationRunner接口的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 深度源码解析Java 线程池的实现原理

    深度源码解析Java 线程池的实现原理

    如何高效的使用这些资源就是程序员在平时写代码时候的一个努力的方向。本文要说的线程池就是一种对 CPU 利用的优化手段。对Java 线程池的实现原理相关知识感兴趣的朋友一起看看吧
    2021-05-05
  • MyBatis-Plus中使用EntityWrappe进行列表数据倒序设置方式

    MyBatis-Plus中使用EntityWrappe进行列表数据倒序设置方式

    这篇文章主要介绍了MyBatis-Plus中使用EntityWrappe进行列表数据倒序设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringBoot详解如何实现读写分离

    SpringBoot详解如何实现读写分离

    当响应的瓶颈在数据库的时候,就要考虑数据库的读写分离,当然还可以分库分表,那是单表数据量特别大,当单表数据量不是特别大,但是请求量比较大的时候,就要考虑读写分离了.具体的话,还是要看自己的业务...如果还是很慢,那就要分库分表了...我们这篇就简单讲一下读写分离
    2022-05-05
  • 解决Java项目启动报错:Logback configuration error detected:问题

    解决Java项目启动报错:Logback configuration error detected:问题

    这篇文章主要介绍了解决Java项目启动报错:Logback configuration error detected:问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java泛型通配符的使用详解

    Java泛型通配符的使用详解

    本文主要介绍了Java泛型通配符的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • SpringBoot访问请求404解决方法

    SpringBoot访问请求404解决方法

    这篇文章主要介绍了SpringBoot访问请求404解决方法,文中有详细的解决方法供大家参考,对我们学习或工作有一定的帮助,需要的朋友跟着小编一起来学习吧
    2023-07-07
  • java多线程之线程,进程和Synchronized概念初解

    java多线程之线程,进程和Synchronized概念初解

    这篇文章主要介绍了java多线程之线程,进程和Synchronized概念初解,涉及进程与线程的简单概念,实现多线程的方式,线程安全问题,synchronized修饰符等相关内容,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • Java的Struts框架中配置国际化的资源存储的要点解析

    Java的Struts框架中配置国际化的资源存储的要点解析

    这篇文章主要介绍了Java的Struts框架中配置国际化的资源存储的要点解析,针对用户所使用的语言来配置资源文件,需要的朋友可以参考下
    2016-04-04
  • IDEA如何设置SVN提交忽略文件 target.iml

    IDEA如何设置SVN提交忽略文件 target.iml

    使用IDEA的SVN插件时,可能会遇到提交不必要文件的问题,解决这个问题有两种方法:第一种是在IDEA设置中的File Types下的Ignore files and folders添加需要忽略的文件或文件夹;第二种是使用SVN客户端TortoiseSVN,在项目目录点击右键选择properties
    2024-10-10

最新评论