作为一个代码强迫症加代码外貌协会, 写代码的时候总会想提高代码可读性, 不管性能怎么样, 至少要长得好看. 后来又看到有推友的mentor说: “来, 让我润一下你的代码”, 被戳中了笑点, 于是就有了这个标题. 对于新手来说, 想一下就写出诗一样的代码是几乎不可能的事, 但是在一定的规范下, 却可以让无论谁写的代码都可以被轻松地理解, 去限制过度个性化, 但又不消灭创造性和优雅性, 提高协同工作的效率, 维护同事之间深厚的友谊. 于是乎, 我花了将近一周的午休时间刷了一遍Java开发手册嵩山版. 在此记录一下重点内容.
开发手册有强制/推荐/参考三大类, 其中几乎所有的强制的内容我认为是Java程序员都应该遵守的, 而推荐和参考的内容可以根据自己项目的具体情况使用, 在我自己的这篇博客中不做区分.
编程规约
- 杜绝完全不规范的缩写, 避免望文不知义. 比如desc, 是MySQL的降序关键字, 如果把description也这样缩写, 会引起歧义
- 在常量与变量的命名时, 表示类型的名词放在词尾, 以提升辨识度. startTime/workQueue/nameList
- 对于Service和DAO类, 基于SOA的理念, 暴露出来的服务一定是接口, 内部的实现类用Impl的后缀与接口区别. CacheServiceImpl实现CacheService
- Dao层方法: 单个对象的方法用get做前缀/取多个对象的方法用list做前缀, 复数结尾/获取统计值的方法用count做前缀/插入的方法用 insert做前缀/删除的方法用remove, delete做前缀/修改的方法用update做前缀
- 不允许任何魔法值直接出现在代码中. 实际开发中, 有时候还是会见到魔法值, 比如加个括号, 我有时候还是会写魔法值, 但是都会加上相应的注释
- 注释的双斜线与注释内容之间有且仅有一个空格. 这一点每个人习惯不同, 我觉得把双斜线和文字分开, 在视觉上会更加清晰
- 在进行类型强制转换时,右括号与强制转换值之间不需要任何空格隔开.
int second = (int)first + 2;
- 单行字符数限制不超过120个. 一行写很长的代码会让人很痛苦. 现在屏幕变大了, 这个要求可以放宽到160.
- 单个方法的总行数不超过80行. 把各种逻辑写一起, 不光不好读, 写
try-catch, 写ut的时候也会哭
- 避免通过一个类的对象引用访问此类的静态变量或静态方法, 无谓增加编译器解析成本
- Object的equals方法容易抛空指针异常. JDK7引入
java.util.Objects#equals(Object a, Object b), 完美解决NPE.
- BigDecimal的等值比较应使用
compareTo()方法, 而不是equals()方法. equals()会比较精度, 造成误解
- 构造方法
BigDecimal(double)存在精度损失风险.** 用BigDecimal(String).
- 所有的POJO类属性必须使用包装数据类型, RPC方法的返回值和参数必须使用包装数据类型.
日期时间
- 正确的时间格式
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"). YYYY代表week in which year, 每周默认从周日开始, 周六结束.
- 获取当前毫秒数:
System.currentTimeMillis();.