1、济南安之畅智能交通科技有限公司 JAVA 编码规范1济南安之畅智能交通科技有限公司JAVA 编码规范Version 1.02010 年 10 月济南安之畅智能交通科技有限公司 JAVA 编码规范2目录第一章 概述 .4规范制定原则 .4术语定义 4第二章 代码外观 42.1 缩进 .42.2 换行 .42.3 空行 .42.4 空格 .52.5 括号 - ().52.6 花括号 - .5第三章 程序注释 .73.1 注释概述 73.2 文档型注释 73.3 块注释 .83.4 单行注释 8第四章 声明 .9变量声明 9初始化 9位置 .9类和接口的声明 .9字段的声明 10第五章 命名规范 1
2、25.1 命名概述 125.2 大小写规则 125.3 命名规范 12第六章 语句 .176.1 每行一个语句 176.2 复合语句 .17济南安之畅智能交通科技有限公司 JAVA 编码规范36.3 RETURN 语句 176.4 IF、 IF-ELSE、IF ELSE-IF 语句 .176.5 FOR、FOREACH 语句 186.6 WHILE 语句 .186.7 DO - WHILE 语句 186.8 SWITCH - CASE 语句 196.9 TRY - CATCH 语句 .196.10 USING 块语句 .196.11 GOTO 语句 .20济南安之畅智能交通科技有限公司 JAV
3、A 编码规范4第一章 概述规范制定原则1 方便代码的交流和维护。2 不影响编码的效率,不与大众习惯冲突。3 使代码更美观、阅读更方便。4 使代码的逻辑更清晰、更易于理解。术语定义jta: Java Transaction API(Java 事务 API),Java 中进行事务划分的技术。JMX(Java Management Extensions,即 Java 管理扩展)是 Java 平台上为应用程序、设备、系统等植入管理功能的框架。JMX 可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。J2EE 连接器架构(J2EE Connecto
4、r Architecture,JCA,J2C, J2CA)是基于 Java 的连接应用服务器和企业信息系统(EIS)的技术解决方案,作为企业应用集成 (EAI)解决方案的一部分。就像 JDBC 专门用于连接 J2EE 应用和数据库,JCA 是一种连接 legacy system(包括数据库)的更通用的体系架构。第二章 代码外观2.1 缩进 缩进应该是每行一个 Tab(4 个空格),不要在代码中使用 Tab 字符。2.2 换行代码列宽控制在 110 字符左右,当表达式超出 或即将超出规定的列宽,遵循以下规则进行换行1、在逗号后换行。2、 在操作符前换行。3、规则 1 优先于 规则 2。当以上规则
5、会导致代码混乱的时候自己采取更灵活的换行规则。2.3 空行空行是为了将逻辑上相关联的代码分块,以便提高代码的可阅读性。在以下情况下使用两个空行1、接口和类的定义之间。2、枚举和类的定义之间。3、类与类的定义之间。 济南安之畅智能交通科技有限公司 JAVA 编码规范5在以下情况下使用一个空行1、方法与属性、属性与属性 之间。2、方法中变量声明 与语句之间。3、方法与方法之间。4、方法中不同的逻辑块之间。5、方法中的返回语句与其他的语句之间。6、属性与方法、属性与字段、方法与字段之间。7、注释与它注释的语句间不空行,但与其他的语句间空一行。2.4 空格在以下情况中要使用到空格1、 关键字和左括符
6、“(” 应该用空格隔开。如while (true) 注意在方法名和左括符 “(” 之间不要使用空格,这样有助于辨认代码中的方法调用与关键字。 2、多个参数用逗号隔开,每个逗号后都应加一个空格。3、除了 . 之外,所有的二元操作符都应用空格与它们的操作数隔开。一元操作符、+及-与操作 数间不需要空格。如a += c + d;a = (a + b) / (c * d);while (d+ = s+)n+;4、 语句中的表达式之间用空格隔开。如for (expr1; expr2; expr3)2.5 括号 - ()1、 左括号 “(” 不要紧靠关键字,中间用一个空格隔开。2、 左括号 “(” 与方法
7、名之间不要添加任何空格。3、 没有必要的话不要在返回语句中使用() 。如if (condition)Array.Remove(1)return 1 2.6 花括号 - 1、 左花括号 “” 放于关键字或方法名的右边。如济南安之畅智能交通科技有限公司 JAVA 编码规范6if (condition) public int Add(int x, int y)2、 右花括号 “” 要与相应的方法声明 “”对齐。3、 通常情况下右花括号 “”单独成行,不与任何语句并列一行。济南安之畅智能交通科技有限公司 JAVA 编码规范7第三章 程序注释3.1 注释概述不要吝啬注释。给以后需要理解你的代码的人们(或
8、许就是你自己)留下信息是非常有用的。注释应该和它们所注释的代码一样是书写良好且清晰明了。1、修改代码时,总是使代码周围的注释保持最新。2、在每个例程的开始,提供标准的注释样本以指示例程的用途、假设和限制很有帮助。注释样本应该是解释它为什么存在和可以做什么的简短介绍.3、及时移除所有临时或无关的注释,以避免在日后的维护工作中产生混乱。4、如果需要用注释来解释复杂的代码节,请检查此代码以确定是否应该重写它。尽一切可能不注释难以理解的代码,而应该重写它。尽管一般不应该为了使代码更简单以便于人们使用而牺牲性能,但必须保持性能和可维护性之间的平衡。5、在编写注释时使用完整的句子。注释应该阐明代码,而不应
9、该增加多义性。6、在编写代码时就注释,因为以后很可能没有时间这样做。另外,如果有机会复查已编写的代码,在今天看来很明显的东西六周以后或许就不明显了。7、对由循环和逻辑分支组成的代码使用注释。这些是帮助源代码读者的主要方面。8、在整个应用程序中,使用具有一致的标点和结构的统一样式来构造注释。9、为了是层次清晰,在闭合的右花括号后注释该闭合所对应的起点。3.2 文档型注释(1) 文档注释置于将要注释的类或方法定义之前。(2) 专有注释定界符/* 开头。(3) 第一行描述该方法的目的。(4) 对每个参数进行注释。每行以param 开始,此后是参数名和简要说明。(5) 最后一行描述该方法的返回值。以r
10、eturn 开始。(6) 最后以*/结束。例如:1 /*2 * 这个方法要完成的功能3 * param name 参数意义4 * return 最后要返回一个什么什么的5 * 作者6 * 修改时间7 */8 济南安之畅智能交通科技有限公司 JAVA 编码规范83.3 块注释块注释以 /* 开头,以 */ 结尾1、程序块注释,如/*注释*/. . . (the source code )2、 屏蔽不再使用的代码。/*. . . (the source code )*/3.4 单行注释该类注释用于1 方法内的代码注释。如变量的声明、代码或代码段的解释。注释示例:/ 注释语句private int
11、number;2 方法内变量的声明或花括号后的注释, 注释示例:if ( 1 = 1) statement; / always true济南安之畅智能交通科技有限公司 JAVA 编码规范9第四章 声明变量声明一行只建议作一个声明,并按字母顺序排列。如int level; /推荐int size; /推荐初始化在声明基本型变量时要在定义时进行初始化,其他类型变量最好在使用前进行初始化。 位置变量建议置于块的开始处,不要总是在第一次使用它们的地方做声明。如void MyMethod()int int1 = 0; / beginning of method blockif (condition)in
12、t int2 = 0; / beginning of “if“ block.应避免不同层次间的变量重名,如int count;.void MyMethod()if (condition) int count = 0; / 避免.对于流程控制语句编码方式最好采用如下 java 默认方式:if,if-else,if else-if else 语句(if, if-else, if else-if else Statements)if-else 语句应该具有如下格式:if (condition) statements;济南安之畅智能交通科技有限公司 JAVA 编码规范10if (condition)
13、statements; else statements;if (condition) statements; else if (condition) statements; elsestatements;注意:if 语句总是用“和“括起来,避免使用如下容易引起错误的格式:if (condition) /AVOID! THIS OMITS THE BRACES !statement;(6) try-catch 语句(try-catch Statements)一个 try-catch 语句应该具有如下格式:try statements; catch (ExceptionClass e) state
14、ments;一个 try-catch 语句后面也可能跟着一个 finally 语句,不论 try 代码块是否顺利执行完,它都会被执行。try statements; catch (ExceptionClass e) 济南安之畅智能交通科技有限公司 JAVA 编码规范11statements; finally statements;类似的循环控制语句For( int i=0;in;i+)While(true)类和接口的声明1 在方法名与其后的左括号间没有任何空格。2 方法间用一个空行隔开。字段的声明你可以任意使用如下的修改限定关键字来定义一个字段:final 或者 volatile 和/或者 s
15、tatic 和/或者transient。如果你将一个字段定义为 final,编译器将确保字段当成一个常量 只读变量来初始化和处理。因为编译器知道常量是不变的,所以在程序的字节码中对其进行了内部优化。class Employeefinal int ACCOUNTANT = 1;final int PAYROLL_CLERK = 2;final int MANAGER = 3;int jobID = ACCOUNTANT;如果你将一个字段声明为 volatile,则多线程将能访问此字段,而特定的编译器将防止最优化以使该字段能被适当的访问。如果你将一个字段定义为 static,则所有对象都将共享此字
16、段的一份拷贝。当你将一个新值赋给这个字段时,所有对象都将得到这个新值。如果没有指定为 static,则这个字段将是一个实例字段,每个对象都使用他们自己的一份拷贝。定义为 transient 的字段值在对象串行化过程中将不被保存。实例字段“实例字段” 就是没有使用 static 修改标识符定义的字段。实例字段和对象紧密相连而不是和类。当在济南安之畅智能交通科技有限公司 JAVA 编码规范12一个对象代码里修改时,仅仅这个相关的类实例对象可以得到这个改变。实例字段随对象的创建而创建,随对象的释放而释放。类字段类字段是用 static 关键字定义的字段。类字段和类联系而不是对象。当在一个类代码中修改
17、时,这个类(以及所有创建的对象)都能感知这个变化。类字段随类的加载而创建,随类的卸载而释放常量“常量”是一种只读变量;当 JVM 初始化这种变量后,变量的值就不能改变了。使用 final 关键字来定义常量。正如有两种字段实例和类字段,常量也有两种实例常量和类常量。为了提高效率,应当创建类常量,或者说是 final static 字段。class Constantsfinal int FIRST = 1;final static int SECOND = 2;public static void main(String args)int iteration = SECOND;if (iterat
18、ion = FIRST)/编译错误System.out.println(“first iteration”);elseif (iteration = SECOND)System.out.println(“second iteration”);上例中的 Constants 类定义了一对常量FIRST 和 SECOND。FIRST 是实例常量,因为 JVM 给每个Constants 对象分配一份 FIRST 的拷贝。相反的,因为 JVM 在加载 Constants 类后只创建了一份SECOND 拷贝,所以 SECOND 是类常量。注意:当你尝试在 main()中直接访问 FIRST 时会导致一个编
19、译错误。常量 FIRST 直到一个对象创建时才存在,所以 FIRST 仅仅只能被这个对象所访问而不是类济南安之畅智能交通科技有限公司 JAVA 编码规范13第五章 命名规范5.1 命名概述选择正确名称时的困难可能表明需要进一步分析或定义项的目的。使名称足够长以便有一定的意义,并且足够短以避免冗长。唯一名称在编程上仅用于将各项区分开。表现力强的名称是为了帮助人们阅读;因此,提供人们可以理解的名称是有意义的。不过,请确保选择的名称符合适用语言的规则和标准。 以下几点是推荐的命名方法。1、避免使用无意义的名称,如 a,b,c。循环索引可使用 i,j 等。2、在类属性的名称中包含类名是多余的,如 Bo
20、ok.BookTitle。而是应该使用 Book.Title。3、只要合适,在变量名的末尾或开头加计算限定符(Avg、Sum、Min、Max、Index)。4、在变量名中使用互补对,如 min/max、begin/end 和 open/close。 5、布尔变量名应该包含 Is,这意味着 Yes/No 或 True/False 值,如 fileIsFound。5.2 大小写规则1.变量 tableNumber 常量 TABLENUMBER 包 tablenumber 类 TableNumber 2.原则上,常量全部大写,包全部小写,变量和方法都是首单词第一个小写,剩余连接单词首字母大写3.语法
21、上 package Name 是要小写的,其他没有语法上的限制。想怎么写就怎么写。当然这是说语法上的 从规范上说。 Package Name 全部小写。 Constant Name 全部大写。 最好是 noun Variable Name 首字母小写,其余随意 最好是 noun Method Name 首字母小写,其余随意,最好是 verb+noun Class Name 首字母大写,其余随意 最好是 noun 或者 verb+noun 不过在定义名称时,尽量有些意义,这样在 review 比较方便 5.3 命名规范定义规范的目的是为了使项目的代码样式统一,使程序有良好的可读性。包的命名(全部
22、小写,由域名定义) Java 包的名字都是由小写单词组成。但是由于 Java 面向对象编程的特性,每一名 Java 程序员济南安之畅智能交通科技有限公司 JAVA 编码规范14都 可以编写属于自己的 Java 包,为了保障每个 Java 包命名的唯一性,在最新的 Java 编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前缀。 由于互联网上的域名称是不会重复的,所以程序员一般采用自己在互联网上的域名称作为自己程序包的唯一前缀。 例如:net.frontfree.javagroup 类的命名(单词首字母大写)根据约定,Java 类名通常以大写字母开头,如果类名称由多个单词组成,则每个单词
23、的首字母均应为大 写例如 TestPage;如果类名称中包含单词缩写,则这个所写词的每个字母均应大写,如:XMLExample, 还有一点命名技巧就是由于类是设计用来 代表对象的,所以在命名类时应尽量选择名词。 例如: Graphics 方法的命名 (首字母小写,字母开头大写)方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头。 例如:drawImage常量的命名(全部大写 ,常加下划线)常量的名字应该都使用大写字母,并且指出该常量完整含义。如果一个常量名称由多个单词组成,则应该用下划线来分割这些单词。 例如:MAX_VALUE 参数的命名 参数的命名规范和方法的命名规范相
24、同,而且为了避免阅读程序时造成迷惑,请在尽量保证参数名称为一个单词的情况下使参数的命名尽可能明确。Javadoc 注释 Java 除了可以采用我们常见的注释方式之外,Java 语言规范还定义了一种特殊的注释,也就是我们 所说的 Javadoc 注释,它是用来记录我们代码中的 API 的。 Javadoc 注释是一种多行注释,以/* 开头,而以 */结束,注释可以包含一些 HTML 标记符和专门的关键词。使用 Javadoc 注释的好处是编写的注释可以被自动转为在线文档,省去了单独编写程序文档的麻烦。 例如: /* * This is an example of * Javadoc * auth
25、or darchon * version 0.1, 10/11/2002 */ 在每个程序的最开始部分,一般都用 Javadoc 注释对程序的总体描述以及版权信息,之后在主程序中 可以为每个类、接口、方法、字段添加 Javadoc 注释,每个注释的开头部分先用一句话概济南安之畅智能交通科技有限公司 JAVA 编码规范15括该类、接口、方法、字段所完成的功能,这句话应单独占据一行以突出其概括作用,在这句话后面可以跟 随更加详细的描述段落。在描述性段落之后还可以跟随一些以 Javadoc 注释标签开头的特殊段落,例如上面例子中的auther 和version,这 些段落将在生成文档中以特定方式显示
26、。变量和常量命名变量的命名主要的的命名规范有以下三种:Camel 标记法:首字母是小写的,接下来的单词都以大写字母开头Pascal 标记法:首字母是大写的,接下来的单词都以大写字母开头匈牙利标记法:在以 Pascal 标记法的变量前附加小写序列说明该变量的类型在 Java 我们一般使用匈牙利标记法,基本结构为 scope_typeVariableName,它 使用 1-3 字符前缀来表示数据类型,3 个字符的前缀必须小写,前缀后面是由表意性强的一个单词或多个单词组成的名字,而且每个单词的首写字母大写,其它字 母小写,这样保证了对变量名能够进行正确的断句。例如,定义一个整形变量,用来记录文档数量
27、:intDocCount,其中 int 表明数据类型,后面为表 意的英文名,每个单词首字母大写。这样,在一个变量名就可以反映出变量类型和变量所存储的值的意义两方面内容,这使得代码语句可读性强、更加容易理解。 byte、int、char、long、float、 double、boolean 和 short。 数据类型/前缀(附)byte bchar cshort shint ilong lchar cstring sfloat fdouble dhashtable h arrList lstVector vStringBuffer sbBoolean bByte btMap map济南安之畅智能
28、交通科技有限公司 JAVA 编码规范16Object ob对于在多个函数内都要使用的全局变量,在前面再增加“g_”。例如一个全局的字符串变量:g_strUserInfo。在变量命名时要注意以下几点: 选择有意义的名字,注意每个单词首字母要大写。 在一段函数中不使用同一个变量表示前后意义不同的两个数值。 i、j、k 等只作为小型循环的循环索引变量。 避免用 Flag 来命名状态变量。 用 Is 来命名逻辑变量,如:blnFileIsFound。通过这种给布尔变量肯定形式的命名方式,使得其它开发人员能够更为清楚的理解布尔变量所代表的意义。 如果需要的话,在变量最后附加计算限定词,如:curSale
29、sSum。 命名不相包含,curSales 和 curSalesSum。 static final 变量(常量)的名字应该都大写,并且指出完整含义。 如果需要对变量名进行缩写时,一定要注意整个代码中缩写规则的一致性。例如,如果在代码的某些区域中使用 intCnt,而在另一些区域中又使用 intCount,就会给代码增加不必要的复杂性。建议变量名中尽量不要出现缩写。 通过在结尾处放置一个量词,就可创建更加统一的变量,它们更容易理解,也更容易搜索。例如,请使用 strCustomerFirst 和 strCustomerLast,而不要使用 strFirstCustomer 和strLastCus
30、tomer。常 用的量词后缀有:First (一组变量中的第一个)、Last(一组变量中的最后一个)、Next (一组变量中的下一个变量)、Prev (一组变量中的上 一个)、Cur (一组变量中的当前变量)。 为每个变量选择最佳的数据类型,这样即能减少对内存的需求量,加快代码的执行速度,又会降低出错的可能性。用于变量的数据类型可能会影响该变量进行计算所产生的结果。在这种情况下,编译器不会产生运行期错误,它只是迫使该值符合数据类型的要求。这类问题极难查找。 尽量缩小变量的作用域。如果变量的作用域大于它应有的范围,变量可继续存在,并且在不再需要该变量后的很长时间内仍然占用资源。它们的主要问题是,
31、任何类 中的任何方法都能对它们进行修改,并且很难跟踪究竟是何处进行修改的。占用资源是作用域涉及的一个重要问题。对变量来说,尽量缩小作用域将会对应用程序的 可靠性产生巨大的影响。 关于常量的命名方法,在 JAVA 代码中,无论什么时候,均提倡应用常量取代数字、固定字符串。也就是 说,程序中除 0,1 以外,尽量不应该出现其他数字。常量可以集中在程序开始部分定义或者更宽的作用域内,名字应该都使用大写字母,并且指出该常量完整含 义。如果一个常量名称由多个单词组成,则应该用下划线“_”来分割这些单词如:NUM_DAYS_IN_WEEK、MAX_VALUE。济南安之畅智能交通科技有限公司 JAVA 编码
32、规范17第六章 语句6.1 每行一个语句每行最多包含一个语句。如a+; /推荐b-; /推荐a+; b-; /不推荐6.2 复合语句复合语句是指包含“父语句子语句 ;子语句;“ 的语句,使用复合语句应遵循以下几点1 子语句要缩进。2 左花括号“” 在复合语句父语句的下一行并与之对齐,单独成行。3 即使只有一条子语句要不要省略花括号“ ”。 如while (d + = s+) n+;6.3 return 语句return 语句中不使用括号,除非调用方法或能使返回值更加清晰。如return (1); /不推荐return myDisk.size();return (size ? size : de
33、faultSize);6.4 if、 if-else、if else-if 语句 if、 if-else、if else-if 语句使用格式if (condition) statements;if (condition) statements;elsestatements;济南安之畅智能交通科技有限公司 JAVA 编码规范18If (condition) statements; else if (condition) statements; elsestatements; 6.5 for、 foreach 语句for 语句使用格式for (initialization; condition;
34、update) statements;空的 for 语句(所有的操作都在 initialization、condition 或 update 中实现)使用格式for (initialization; condition; update); / update user idforeach 语句使用格式foreach (object obj in array) statements;注意 1 在循环过程中不要修改循环计数器。2 对每个空循环体给出确认性注释。6.6 while 语句while 语句使用格式while (condition) statements;空的 while 语句使用格式whi
35、le (condition);6.7 do - while 语句do - while 语句使用格式do statements;济南安之畅智能交通科技有限公司 JAVA 编码规范19 while (condition); 6.8 switch - case 语句switch - case 语句使用格式switch (condition) case 1:statements;break;case 2:statements;break;default:statements;break;注意:1、语句 switch 中的每个 case 各占一行。2、语句 switch 中的 case 按字母顺序排列。
36、3、为所有 switch 语句提供 default 分支。 4、所有的非空 case 语句必须用 break; 语句结束。 6.9 try - catch 语句 try - catch 语句使用格式try statements; catch (ExceptionClass e) statements; finally statements;6.10 using 块语句 using 块语句使用格式using (object) statements;济南安之畅智能交通科技有限公司 JAVA 编码规范206.11 goto 语句 goto 语句使用格式,不建议使用 gotogoto Label1:statements;Lable1:statements;