Ali-Check 【1.使用记录】

前言


对使用AliCheck的相关内容进行记录,主要分为4篇

  • 1.使用记录
  • 2.Blocker
  • 3.Critical
  • 4.Major

本篇为使用记录篇,主要是记录基本使用规则,以及列出相关检查项。

Alibaba Java Coding Guidelines

  • 版本:v2.0.0
  • 项目github地址
安装

官方安装文档:IDEA插件使用文档

Blocker(11)

No Inspection
1 long或者Long初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。
2 不要在foreach循环里进行元素的remove/add操作,remove元素请使用Iterator方式。
3 在if/else/for/while/do语句中必须使用大括号,即使只有一行代码,避免使用下面的形式:if (condition) statements;
4 在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
5 多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题。
6 所有的包装类对象之间值的比较,全部使用equals方法比较。
7 所有的覆写方法,必须加@Override注解。
8 线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
9 获取当前毫秒数:System.currentTimeMillis(); 而不是new Date().getTime();
10 避免用Apache Beanutils进行属性的copy。
11 避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。
Critical(23)

No Inspection
1 ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException异常。
2 Map/Set的key为自定义对象时,必须重写hashCode和equals。
3 Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。
4 POJO类中的任何布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误
5 SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。
6 不能使用过时的类或方法。
7 不能在finally块中使用return,finally块中的return返回后方法结束执行,不会再执行try块中的return语句。
8 使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常。
9 使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一样的数组,大小就是list.size()
10 创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。创建线程池的时候请使用带ThreadFactory的构造函数,并且提供自定义ThreadFactory实现或者使用第三方实现。
11 在subList场景中,高度注意对原列表的修改,会导致子列表的遍历、增加、删除均产生ConcurrentModificationException异常。
12 在一个switch块内,每个case要么通过break/return等来终止,要么注释说明程序将继续执行到哪一个case为止;在一个switch块内,都必须包含一个default语句并且放在最后,即使它什么代码也没有。
13 对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别
14 常量命名应该全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长
15 异常类命名使用Exception结尾
16 必须回收自定义的ThreadLocal变量,尤其在线程池场景下,线程经常会被复用,如果不清理自定义的 ThreadLocal变量,可能会影响后续业务逻辑和造成内存泄露等问题。尽量在代理中使用try-finally块进行回收。
17 所有的枚举类型字段必须要有注释,说明每个数据项的用途。
18 所有编程相关的命名均不能以下划线或美元符号开始
19 抽象类命名使用Abstract或Base开头
20 方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase,必须遵从驼峰形式
21 日期格式化字符串[%s]使用错误,应注意使用小写‘y’表示当天所在的年,大写‘Y’代表week in which year。
22 浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断。
23 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
Major(26)

No Inspection
1 iBATIS自带的queryForList(String statementName,int start,int size)不推荐使用
2 POJO类必须写toString方法。使用工具类source> generate toString时,如果继承了另一个POJO类,注意在前面加一下super.toString。
3 不允许任何魔法值(即未经定义的常量)直接出现在代码中。
4 中括号是数组类型的一部分,数组定义如下:String[] args
5 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。
6 使用CountDownLatch进行异步转同步操作,每个线程退出前必须调用countDown方法,线程执行代码注意catch异常,确保countDown方法可以执行,避免主线程无法执行至await方法,直到超时才返回结果。
7 关于基本数据类型与包装数据类型的使用标准
8 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式
9 单个方法的总行数不超过80行。
10 及时清理不再使用的代码段或配置信息。
11 后台输送给页面的变量必须加感叹号,${var}——中间加感叹号!。
12 定义DO/DTO/VO等POJO类时,不要加任何属性默认值。
13 循环体内,字符串的联接方式,使用StringBuilder的append方法进行扩展。
14 所有的抽象方法(包括接口中的方法)必须要用javadoc注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。
15 所有的类都必须添加创建者信息。
16 方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/* */注释。注意与代码对齐。
17 注意 Math.random() 这个方法返回是double类型,注意取值的范围[0,1)(能够取到零值,注意除零异常),如果想获取整数类型的随机数,不要将x放大10的若干倍然后取整,直接使用Random对象的nextInt或者nextLong方法。
18 测试类命名以它要测试的类的名称开始,以Test结尾
19 禁止使用构造方法BigDecimal(double)的方式把double值转化为BigDecimal对象
20 类、类属性、类方法的注释必须使用javadoc规范,使用/内容/格式,不得使用//xxx方式和/xxx*/方式。
21 类名使用UpperCamelCase风格,必须遵从驼峰形式,但以下情形例外:(领域模型的相关命名)DO / BO / DTO / VO / DAO
22 返回类型为基本数据类型,return包装数据类型的对象时,自动拆箱有可能产生NPE
23 避免Random实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed 导致的性能下降。说明:Random实例包括java.util.Random 的实例或者 Math.random()的方式。
24 避免采用取反逻辑运算符。
25 除常用方法(如getXxx/isXxx)等外,不要在条件判断中执行复杂的语句,将复杂逻辑判断的结果赋值给一个有意义的布尔变量,以提高可读性。
26 集合初始化时,指定集合初始值大小。

你可能感兴趣的:(Ali-Check 【1.使用记录】)