1.[强制] 不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。
反例:
1 2 |
String key = "Id#taobao_" + tradeId; cache.put(key, value); |
老四附言:
魔法值往往时间久了会不知道这个值是干嘛的,比如说数字魔法值,某个方法中用了比较多的1,2,3,4等,突然之间回去查看很难回忆起他们代表的是什么,如果实现定义并且变量名称起一个有意义的名字会很好的帮助Code Review。
2.[强制] long或者Long初始赋值时,使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。
说明: Long a = 2l; 写的是数字的21,还是Long型的2?
老四附言:
其实这个怎么说呢,有一个良好的变成习惯是极好的,所以我觉得本条规则其实更多也是从阅读代码的角度来讲,避免他人误读。毕竟没几个傻呵呵的人会吧l写成1,所以为了他人考虑,统一使用大写是很好的编程习惯!
3.[推荐] 不要使用一个常量类维护所有常量,按常量功能进行归类,分开维护。
说明: 大而全的常量类,非得使用查找功能才能定位到修改的常量,不利于理解和维护。
正例: 缓存相关常量放在类CacheConsts下;系统配置相关常量放在类ConfigConsts下。
老四附言:
对于大项目而言,根据具体的业务来处理常量会使得项目清晰明了,小来小去的项目直接一个类甚至当前类直接书写就好了。所以规约也都是根据项目以及具体的业务场景来断定的,随着项目的发展而慢慢的去适应规约规则。
4.[推荐] 常量的复用层次有五层: 跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。
- 跨应用共享常量: 放置在二方库中,通常是client.jar中的constant目录下。
- 应用内共享常量: 放置在一方库中,通常是子模块中的constant目录下。
反例: 易懂变量也要统一定义成应用内共享常量,两位攻城师在两个类中分别定义了表示”是”的变量:
类A中: public static final String YES = “yes”;
类B中: public static final String YES = “y”;
A.YES.equals(B.YES),预期是true,但实际返回为false,导致线上问题。 - 子工程内部共享常量: 即在当前子工程的constant目录下。
- 包内共享常量: 即在当前包下单独的constant目录下。
- 类内共享常量: 直接在类内部private static final定义。
老四附言:
关于一方库、二方库、三方库的基本解释老四之前在文章《阿里巴巴Java开发手册第六章-二方库依赖篇》做过一些说明,可以前去参考一下,至于常量复用层次孤尽老师已经说很详细了,无需多言。
5.[推荐] 如果变量值仅在一个固定范围内变化用enum类型来定义。
说明: 如果存在名称之外的延伸属性使用enum类型,下面正例中的数字就是延伸信息,表示一年中的第几个季节。
正例:
1 2 3 4 5 6 7 |
public enum SeasonEnum { SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4); int seq; SeasonEnum(int seq){ this.seq = seq; } } |
老四附言:
(⊙o⊙)…,其实这是enum的使用方式,详细可以参考一下老四浅析的《阿里巴巴Java开发规约第一章-注释规约篇》文章,文中第五条规约(强制所有的枚举类型字段必须要有注释,说明每个数据项的用途)浅析对enum的使用方式和enum的基础知识做了较多的讲解。
更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请赞助盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额,老四这里抱拳了。赞助时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的赞赏钱财也会被用于小站的服务器运维上面,再次抱拳。