代码走查案例2
使用阿里代码规约IDEA插件扫描了工程代码,发现了需要优化的地方,希望大家可以在开发自己的项目时避免此类问题。
【Blocker】
- long或者Long初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。
- 在if/else/for/while/do语句中必须使用大括号,即使只有一行代码,避免使用下面的形式:if (condition) statements;
- 在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
- 所有的包装类对象之间值的比较,全部使用equals方法比较。
- 所有的覆写方法,必须加@Override注解。
- 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
- 获取当前毫秒数:System.currentTimeMillis(); 而不是new Date().getTime();
- 避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。
【Critical】
- Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。
- SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。
- 不能使用过时的类或方法。
- 不能在finally块中使用return,finally块中的return返回后方法结束执行,不会再执行try块中的return语句。
- 在一个switch块内,每个case要么通过break/return等来终止,要么注释说明程序将继续执行到哪一个case为止;在一个switch块内,都必须包含一个default语句并且放在最后,即使它什么代码也没有。
- 常量命名应该全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
- 所有的枚举类型字段必须要有注释,说明每个数据项的用途。
- 抽象类命名使用Abstract或Base开头。
- 方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase,必须遵从驼峰形式。
- 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
【Major】
- POJO类必须写toString方法。使用工具类source> generate toString时,如果继承了另一个POJO类,注意在前面加一下super.toString。
- 不允许任何魔法值(即未经定义的常量)直接出现在代码中。
- 中括号是数组类型的一部分,数组定义如下:String[] args
- 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。
- 关于基本数据类型与包装数据类型的使用标准如下:(1)所有的POJO类属性必须使用包装数据类型。(2)RPC方法的返回值和参数必须使用包装数据类型。(3)所有的局部变量推荐使用基本数据类型。
- 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式
- 单个方法的总行数不超过80行。
- 及时清理不再使用的代码段或配置信息。
- 定义DO/DTO/VO等POJO类时,不要加任何属性默认值。
- 循环体内,字符串的联接方式,使用StringBuilder的append方法进行扩展。
- 所有的抽象方法(包括接口中的方法)必须要用javadoc注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。
- 所有的类都必须添加创建者信息。
- 方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/* */注释。注意与代码对齐。
- 类、类属性、类方法的注释必须使用javadoc规范,使用/**内容*/格式,不得使用//xxx方式和/*xxx*/方式。
- 类名使用UpperCamelCase风格,必须遵从驼峰形式,但以下情形例外:(领域模型的相关命名)DO / BO / DTO / VO / DAO
- 避免采用取反逻辑运算符。
- 除常用方法(如getXxx/isXxx)等外,不要在条件判断中执行复杂的语句,将复杂逻辑判断的结果赋值给一个有意义的布尔变量,以提高可读性。
- 集合初始化时,指定集合初始值大小。
不积跬步,无以至千里;不积小流,无以成江海。