吐槽一下项目中的代码坏味道:滥用java常量

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

public interface IConstant
{
	int ZERO = 0;
	
	String EMPTY_STRING = "";	
}

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

List<String> list = new ArrayList<String>(IConstant.ZERO);
if(IConstant.ZERO == list.size())
{

}

int[] array = {1,2,3}
array[IConstant.ZERO];
if(IConstant.EMPTY_STRING.equals(name))
{

}

为什么要把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全然没有意义。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值