java 开发手册1 与码出高效书一样优秀的编码规范校验插件 Alibaba Java Coding Guidelines 及常见编码规范问题示例

idea:安装插件位置,安装后需要重启ides。File — Settings — Plugins — Browse Repositories

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jvc3Nfd2F5_size_16_color_FFFFFF_t_70

项目常见的代码不规范情况:

常见现象及原因:

  • long或者Long初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。

  • 在if/else/for/while/do语句中必须使用大括号,即使只有一行代码,避免使用下面的形式:if (condition) statements;

  • 在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
  • 在使用阻塞等待获取锁的方式中,必须在try代码块之外,并且在加锁方法与try代码块之间没有任何可能抛出异常的方法调用,避免加锁成功后,在finally中无法解锁。 说明一:如果在lock方法与try代码块之间的方法调用抛出异常,那么无法解锁,造成其它线程无法成功获取锁。 说明二:如果lock方法在try代码块之内,可能由于其它方法抛出异常,导致在finally代码块中,unlock对未加锁的对象解锁,它会调用AQS的tryRelease方法(取决于具体实现类),抛出IllegalMonitorStateException异常。 说明三:在Lock对象的lock方法实现中可能抛出unchecked异常,产生的后果与说明二相同。
  • 所有的包装类对象之间值的比较,全部使用equals方法比较。

  • 所有的覆写方法,必须加@Override注解。

  • 获取当前毫秒数:System.currentTimeMillis(); 而不是new Date().getTime();
  • 避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可。

  • Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用equals。

  • SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用DateUtils工具类。
  • 不能使用过时的类或方法。
  • 不能在finally块中使用return,finally块中的return返回后方法结束执行,不会再执行try块中的return语句。
  • 创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。创建线程池的时候请使用带ThreadFactory的构造函数,并且提供自定义ThreadFactory实现或者使用第三方实现。
  • 对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别
  • 常量命名应该全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长
  • 所有的枚举类型字段必须要有注释,说明每个数据项的用途。
  • 所有编程相关的命名均不能以下划线或美元符号开始
  • 抽象类命名使用Abstract或Base开头
  • 方法名、参数名、成员变量、局部变量都统一使用lowerCamelCase,必须遵从驼峰形式
  • 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
  • POJO类必须写toString方法。使用工具类source> generate toString时,如果继承了另一个POJO类,注意在前面加一下super.toString。
  • 中括号是数组类型的一部分,数组定义如下:String[] args
  • 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。
  • 关于基本数据类型与包装数据类型的使用标准如下:  1) 所有的POJO类属性必须使用包装数据类型。  2) RPC方法的返回值和参数必须使用包装数据类型。  3) 所有的局部变量推荐使用基本数据类型。
  • 单个方法的总行数不超过80行。
  • 及时清理不再使用的代码段或配置信息。
  • 循环体内,字符串的联接方式,使用StringBuilder的append方法进行扩展。
  • 所有的抽象方法(包括接口中的方法)必须要用javadoc注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。
  • 所有的类都必须添加创建者信息。
  • 方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/* */注释。注意与代码对齐。
  • 注意 Math.random() 这个方法返回是double类型,注意取值的范围[0,1)(能够取到零值,注意除零异常),如果想获取整数类型的随机数,不要将x放大10的若干倍然后取整,直接使用Random对象的nextInt或者nextLong方法。
  • 禁止使用构造方法BigDecimal(double)的方式把double值转化为BigDecimal对象
  • 类、类属性、类方法的注释必须使用javadoc规范,使用/**内容*/格式,不得使用//xxx方式和/*xxx*/方式。
  • 类名使用UpperCamelCase风格,必须遵从驼峰形式,但以下情形例外:(领域模型的相关命名)DO / BO / DTO / VO / DAO
  • 返回类型为基本数据类型,return包装数据类型的对象时,自动拆箱有可能产生NPE
  • 除常用方法(如getXxx/isXxx)等外,不要在条件判断中执行复杂的语句,将复杂逻辑判断的结果赋值给一个有意义的布尔变量,以提高可读性。
  • 集合初始化时,指定集合初始值大小。

阻塞级别:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jvc3Nfd2F5_size_16_color_FFFFFF_t_70 1

严重级别:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jvc3Nfd2F5_size_16_color_FFFFFF_t_70 2

主要的:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jvc3Nfd2F5_size_16_color_FFFFFF_t_70 3

并且部分编码规范校验,还支持一键修复,非常方便:当然一键修复没有自己手动修复印象深,手动修复后以后就不会再犯了。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jvc3Nfd2F5_size_16_color_FFFFFF_t_70 4

发表评论

表情:
评论列表 (有 0 条评论,16人围观)

还没有评论,来说两句吧...

相关阅读