我们的项目中是否充斥着类似以下的代码呢?定义一个专门存放常量的java类(接口),非常多其它类依赖该常量类。

  1. public interface IConstant
  2. {
  3. int ZERO = 0;
  4.  
  5. String EMPTY_STRING = "";
  6. }

使用该常量的代码,大致具有例如以下形式:

  1. List<String> list = new ArrayList<String>(IConstant.ZERO);
  2. if(IConstant.ZERO == list.size())
  3. {
  4.  
  5. }
  6.  
  7. int[] array = {1,2,3}
  8. array[IConstant.ZERO];
  9. if(IConstant.EMPTY_STRING.equals(name))
  10. {
  11.  
  12. }

为什么要把0和""定义成一个常量呢?这是没有正确理解究竟什么是魔鬼数字和硬编码。使用常量,出于例如以下几个原因:

1、为了可读性,一个好的名字显然比一串写死的数字更easy理解。

2、避免冗余,让代码更easy改动,实现一处该,处处该的效果。

3、避免程序猿手写常量,不小心写错。比方多写了个0或者是少写了个0等。

4、常量必须是被多个地方使用,并且在不同的地方代表同样的含义。

假设定义的常量没有达到这4个要求中的随意一个,那么能够说这个常量的使用是没有意义的,会导致还有一中代码坏味道:没有必要的复杂性。

上面我们举的样例中:0代表的是列表的长度,也代表数组的第一个元素。不满足第1个要求,由于对于程序猿来说,这仅仅是最主要的语法,额外定义变量不能提高可读性;不满足第2个要求,由于这些东西是不会变的,不存在改动的可能;不满足第3个要求,有IDE的编译提示,并且常量0并不复杂,不存在写错的可能;不满足第4个要求,由于0一会儿代表长度,一会儿代表数组索引,根本没有办法给0取一个有意义的名称。

第4点须要特别注意:一个常量名称仅仅能代表一个业务含义!让列表长度和数组索引“复用”常量值0,这样的做法很不好。尽管降低了常量的个数,貌似实现了"复用",实际上是添加了代码之间的耦合。举个极端的样例,假如java的语法发生重大改变,数组的第一个元素从1開始而不是0,那我们能将常量ZERO改动成1吗?显然不能,假设改动了,是可以保证数组的正确使用,可是会导致列表长度的推断错误。这样的场景下,我们定义的常量ZERO全然没有意义。

吐槽一下项目中的代码坏味道:滥用java常量的更多相关文章

  1. 单元测试系列之四:Sonar平台中项目主要指标以及代码坏味道详解

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6766994.html 众所周知Sona ...

  2. Sonar项目主要指标以及代码坏味道详解

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6766994.html 众所周知Sona ...

  3. Roslyn 入门:使用 Roslyn 静态分析现有项目中的代码

    Roslyn 是微软为 C# 设计的一套分析器,它具有很强的扩展性.以至于我们只需要编写很少量的代码便能够分析我们的项目文件. 作为 Roslyn 入门篇文章,你将可以通过本文学习如何开始编写一个 R ...

  4. [git]安装git-pylint-commit-hook提高python项目中的代码质量

    什么是'git-pylint-commit-hook' 我在工作中,团队为了保证代码和提高代码的质量,要求每个项目都要求安装git-pylint-commit-hook,它是个钩子,会在你提交代码到本 ...

  5. 最新广商小助手 项目进展 OpenGL ES 3D在我项目中引用 代码太多只好选重要部分出来

    package com.example.home; import java.io.IOException; import java.io.InputStream; import javax.micro ...

  6. 针对MSHFlexGrid的一系列通用方法-项目中实践代码分享

    1.给MSHFlexGrid填充数据通用方法 '自定义报表填充程序 fgrid Public Function ShowformfData(Resultset As ADODB.Recordset, ...

  7. 使用eslint将项目中的代码修改统一的缩进

    背景 继承了组里师兄师姐写的项目的前端代码,但是是两个人写的,有两格缩进的,有四格缩进的,有字符串外用单引号的,有用双引号的. 于是搜索了一下,可以用eslint强制转化. eslint在github ...

  8. 在Springboot + Mybaitis-plus 项目中利用Jackson实现json对java多态的(反)序列化

    Jackson允许配置多态类型处理,当JSON面对的转换对象是一个接口.抽象类或者一个基类的时候,可以通过一定配置实现JSON的转换.在实际项目中,Controller层接收入参以及在Dao层将对象以 ...

  9. 使用spring提供的ReflectionUtils简化项目中反射代码的复杂性

    在项目中有时候我们会使用到反射的功能,如果使用最原始的方法来开发反射的功能的话肯能会比较复杂,需要处理一大堆异常以及访问权限等问题.spring中提供了ReflectionUtils 这个反射的工具类 ...

随机推荐

  1. VMware workstation 10.0的永久key

    MA491-6NL5Q-AZAM0-ZH0N2-AAJ5A5A6F6-88247-XZH59-HL0Q6-8CD2VHF6QX-20187-2Z391-522NH-9AELT5F29M-48312-8 ...

  2. 矩阵求逆c++达到

    高斯消元法能够用来找出一个可逆矩阵的逆矩阵.设A 为一个N * N的矩阵,其逆矩阵可被两个分块矩阵表示出来.将一个N * N单位矩阵 放在A 的右手边,形成一个N * 2N的分块矩阵B = [A,I] ...

  3. ROADS+dijkstra的灵活运用+POJ

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10742   Accepted: 3949 Descriptio ...

  4. php学习之路:WSDL详细解释(两)

    3.定义服务使用的逻辑消息 当服务的操作被调用时.服务被定义为消息交换.在wsdl文档中,这些消息被定义message元素. 这些消息由称之为part元素的部分组成. 一个服务的操作,通过指定逻辑消息 ...

  5. 【蓝桥杯】 PREV-1 核桃数

    主题链接:http://lx.lanqiao.org/problem.page?gpid=T24   历届试题 核桃的数量   时间限制:1.0s   内存限制:256.0MB        问题描写 ...

  6. debian软件安装基础(同tomcat案件)

    基本介绍 笔者是一个Linux盲.一旦只在虚拟机上载通过Ubantu-图形版本,我看着接口.打了几场比赛卸载的光盘上. 往下看,在过去的几天.试想想,在Linux关于建设nexus(mavenPW)玩 ...

  7. 开源远程控制RealVNC源代码中的通讯协议RFB(远程帧缓冲)(转)

    在网上流传的gh0st3.6源代码中,远程桌面总是存在CPU占用率高和画面更新不及时等问题.于是想到了著名的开源远程控制RealVNC  它采用了远程帧缓存的协议(Remote Frame buffe ...

  8. netfilter/iptables 结构要点

    转载请注明:http://blog.csdn.net/yeasy/article/details/44311169 四张表,每一个表有若干链. filter INPUT(路由表决策后,到本机的进程) ...

  9. boostrap-非常好用但是容易让人忽略的地方------clearfix

    代码 显示结果 代码 结果

  10. 续x奇数倍(n+2*x)暴力算法是冠军的算法结合数量

    // 续6单a,a+2,a+4,a+6,a+8,a+10是共同的数.最低要求a // 暴力解决方案 首先对结果,后面将代码粘贴: 1次连续n=9,连续值个数: 1;耗时: 0ms,总计: 0ms 2次 ...