写点什么

代码检查规则:Java 语言案例详解

发布于: 刚刚
代码检查规则:Java语言案例详解

本节课程为《代码检查规则:Java 语言案例详解》, 通常情况下 Java 的代码检查规则可以分为以下十类:


接下来,让我们具体来看看每个分类的内容。


一、源文件规范


该类规范主要从文件名、文件编码、特殊字符三个方面制定的规则。


01    

文件名


Java 源文件名必须和它包含的顶层类名保持一致,包括大小写,并以.java 作为后缀名。


02    

文件编码


为保持编码风格的一致性,避免编码不一致导致的乱码问题,要求所有源文件编码必须使用 UTF-8 格式。


03    

特殊字符


特殊字符方面的规则主要是针对换行、缩进、空格等操作而制定,有以下强制规定:

①除换行符以外,ASCII 空格(0x20)是唯一合法的空格字符。

②由于不同系统将 Tab 转化成空格的数目不一致,统一使用空格进行缩进。

③文件的换行符统一使用 Unix 格式(\n),而不要使用 Windows 格式(\r\n)。


二、源文件组织结构规范


这一大类规则主要规定了源文件所应包含的具体组成部分和各个部分之间应遵循的一系列规则。


对于源文件的组成部分,规定如下:

源文件必须按顺序包含:许可证或版权声明、package 语句、import 语句、唯一的顶层类,四个方面的内容。同时,每两个部分之间用一个空行进行分隔,不允许出现多余空行。对于以上四个方面的内容,每个组成部分又有相应的编码规则。


01    

许可证或版权声明规范


如果文件有许可证或版权声明,应放在最开头,如果没有,可以忽略。


02    

package 语句规范


package 语句一定单独占一行不换行,允许该行超出 Java 的 120 字符列宽限制。


03    

import 语句规范


①对于所有非静态导入,禁止使用通配符 import。

②所有未使用的 import 语句均应删除,并且与 package 语句相同。

③每条 import 语句单独占据一行不换行,允许超出 120 字符列宽限制。


04    

类声明规范


①每个源文件只允许包含唯一一个顶层类。若需要定义其他的类,可将多余的类放在另外一个独立的源文件中,或者可将其作为一个内部类,定义在顶层类中来使用。

②重载的方法必须放在一起,即同名的构造函数或方法之间禁止插入其他成员。


三、代码结构规范


这一部分规则主要是对花括号(即大括号)、缩进与换行、空行的一系列规范和一些其他说明。


01    

花括号


花括号经常在类和方法定义以及代码块划分中使用,花括号在使用中常需要合理的换行操作进行配合。规定为:在非空代码块中使用花括号时要遵循 K&R 风格(Kernighan and Ritchie Style),三个主要原则为:

①在左花括号({)前不能换行,在其后换行;

②在右花括号(})前应有换行;

③表示终止的右花括号(})后必须换行,否则,右花括号后不换行。


02    

缩进与换行


缩进与换行主要是为了保证代码风格的一致性,提升代码的可维护性。主要规范有:

①每次开始书写一个新代码块时,使用 4 个空格进行缩进,在代码块结束时,恢复之前的缩进级别。

②每条语句之后都要换行,每行只能有一条完整语句。

③除 package 语句和 import 语句外,代码单行字符数限制不超过 120 个。超出则需要换行,换行时,遵循如下五条原则:

→ 第二行相对第一行缩进四个空格,从第三行开始,不再继续缩进。

→ 运算符与下文一起换行,即运算符位于行首。

→ 方法调用的标点符号与下文一起换行。

→ 方法调用中的多个参数需要换行时,在逗号后进行。

→ 在括号前不要换行。


03    

空行


合理使用空行可以提高代码的可读性,有利于后期维护。


对于空行的使用,有如下规范进行约束:

①在类的不同成员间增加空行,包括:成员变量、构造函数、方法、内部类、静态初始化块、实例初始化块等。

②两个成员变量声明之间可以不加空行。空行通常对于成员变量进行逻辑分组。

③方法体内,按需增加空行,以便从逻辑上对语句进行分组。

④使用空行时,禁止使用连续的空行。


04    

其他说明


Java 中有两种数组定义形式,为规范代码书写形式,要求为:

①类型与中括号紧挨相连来表示数组,即中括号写在数组名之前。


而当注解与注释同时存在时,统一的规范要求为:

②添加在类、方法、构造函数、成员属性上的注解直接写在注释块之后,每个注解独占一行。


当同时存在多个修饰符时,需要按照顺序书写,顺序要求如下:

public protected private abstract static final transient volatile synchronized native strictfp

排在首位的一定是访问修饰符,随后是 abstract,即抽象类或抽象方法,紧接着是 static、final。这是常见的几类修饰符,对于其他的修饰符,可以参考以上列举的顺序进行书写。


为避免小写字母 l 与 1 混淆,有如下规定:

长整型数字必须使用大写字母 L 结尾,以便于和数字 1 进行区分。


四、命名规范


在 Java 中无论是方法名还是类名,均需使用驼峰命名格式进行命名。


01    

驼峰命名格式


对于两种驼峰命名格式的使用范围,有如下规范:

①方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,即首字母小写的驼峰命名格式。

②类名使用 UpperCamelCase 风格,即首字母大写的驼峰命名格式,以下情形例外:DO/BO/DTO/VO/AO/PO/UID 等。


02    

类的命名格式


除此之外,对于一些类,命名格式有更加具体的规范要求:

①抽象类命名使用 Abstract 或 Base 开头;

②异常类命名使用 Exception 结尾;

③测试类命名以它要测试的类的名称开始,以 Test 结尾。


03    

常量命名格式


而对于常量的命名,规范与上所述有所不同:

①常量命名全部大写,单词间用下划线隔开。

②不允许任何未经预先定义的常量直接出现在代码中。


五、OOP 规约


OOP 规约主要是针对面向对象编程过程中定义的一些类所制定的一些规则。


包含的强制规范要求有:

①所有的 POJO 类属性必须使用包装数据类型,禁止使用基本类型。

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

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

④定义 DO/DTO/VO 等 POJO 类时,均不要设定任何属性默认值。


六、集合处理规范


集合和数组是我们开发过程中使用频度最高的两个数据结构,对于二者的使用也有严格的强制规范:

①当需要将集合转换为数组时,必须使用集合的 toArray 方法,传入的是类型完全一样的数组,大小是 list.size()。

②对一个集合求子集合时,需高度注意对原集合元素的增加或删除,均会导致子列表的遍历、增加、删除,产生 ConcurrentModificationException 异常。应通过对子集合进行相应操作,来反射到原集合,从而避免异常的发生。

③不要在循环体内部进行集合元素的 remove/add 操作。remove 元素请使用 Iterator(迭代器)方式,如果并发操作,需要对 Iterator 对象加锁。


七、控制语句规范


Java 中的控制语句主要有 switch、if、else、while 等,这些语句的使用在编码过程中需要遵循以下规范:

①在一个 switch 块内,每个 case 要么通过 break/return 等来终止,要么注释说明程序将继续执行到哪一个 case 为止;在一个 switch 快内,都必须包含一个 default 语句并且放在最后。

②使用 if/else/for/while/do 语句必须使用花括号。即使只有一行代码,避免采用单行的编码方式。

③在高并发场景中,避免使用“等于”判断作为中断或退出的条件。防止在击穿现象下,程序无法正常中断或退出的情况发生。


八、注释规约


合理使用注释可以提高程序可读性,便于后期维护。注释可以是程序说明,也可以是编程思路。Java 中的注释主要分三种形式:文档注释、单行注释和多行注释。注释规约包括:

①类、类属性、类方法的注释必须使用文档注释形式,即使用 /**内容**/ 格式,不得使用单行注释的格式。单行注释和多行注释主要使用在方法体内。

②方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释,使用/*内容*/注释,注意与代码对齐。


九、异常处理规范


在 Java 中,我们通常使用 try catch 来进行捕获异常处理,而 Java 中的异常又分为运行时异常和非运行时异常。

①  对于处理运行时异常,有如下规范:Java 类库中定义的可以通过预检查方式规避的 RuntimeException 异常不应该通过 try catch 的方式来处理,比如:空指针异常和数组越界异常等等。

②  对于捕获后异常的处理,有如下规范:捕获异常是为了处理异常,不要捕获后不进行任何处理而将其抛弃。若不想进行异常的处理,应将该异常抛给它的调用者。最外层的业务使用者必须处理异常,将其转化为用户可以理解的内容。即对于捕获后的异常,要么继续向上抛,要么自己进行处理。

③异常处理的规范要求还包括:不能在 finally 块中使用 return 语句。


十、缺陷检查规则


缺陷检查主要是对 Java 源代码进行静态分析,扫描其中潜在的缺陷,比如:空指针异常、死循环等,这一阶段所应遵循的规则包括:

①不能使用单个字符定义 StringBuffer 和 StringBuilder。

②任何上锁的对象均需保证其锁可以被释放。

③严格避免死循环的发生。

④对于字符串中的点号(“.”)、竖线(“|”)和文件分隔符(“File.separator”)进行替代时,需要注意其特殊含义。

“.”:匹配任意单个字符。在 replaceAll 中使用,它匹配所有内容。

“|”:通常用作选项分隔符,它匹配字符间的空格

“File.separator”:匹配特定平台的文件路径分隔符。在 Windows 上,这将被视为转义字符。

⑤当 synchronize 对成员变量进行上锁时,该成员变量必须是 final 类型的。

⑥synchronize 上锁的成员变量类型一定不能是装箱类型。

⑦所有被 spring 托管的类,其成员属性的初始化均要使用注入的方式。

⑧当使用 try catch 方式进行异常捕获,且需要在 catch 中对异常信息进行输出时,不得使用 printStackTrace 的方式。这种方式会导致后期分析代码困难。而应采用一些 Log 框架,方便用户检索和浏览日志。

⑨方法返回值包含操作状态代码时,该状态码不应被忽略

⑩【%s】数组具有协变性,元素赋值类型与初始化类型不一致,此种情况可通过编译,但运行阶段会发生错误。

⑪对于用户名和密码不应直接写在 Java 的文件中,避免泄露。而应将相应关键信息写在配置文件中进行读取。

⑫方法和成员变量的命名不应相同,也不应通过大小写来进行区分。


关于 Java 的十类代码检查规则

今天就讲解到这了

学完是不是感觉掌握了一个亿!

发布于: 刚刚阅读数: 2
用户头像

关注百度开发者中心,收获一手技术干货。 2018.11.12 加入

汇聚百度所有对外开放技术、平台和服务资源,提供全方位支持,助力开发者加速成功,实现开发者、消费者和百度三方共赢。https://developer.baidu.com/

评论

发布
暂无评论
代码检查规则:Java语言案例详解