JAVA代码规范用友政务软件有限公司2009年12月版权所有为什么要有编码规范编码规范对于程序员而言尤为重要,有以下几个原因:-一个软件的生命周期中,80%的花费在于维护-几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护-编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的代码-如果你将源码作为产品发布,就需要确任它是否被很好的打包并且清晰无误。文件后缀Java程序使用下列文件后缀:•文件类别文件后缀•Java源文件.java•Java字节码文件.class文件组织一个文件由被空行分割而成的段落以及标识每个段落的可选注释共同组成超过2000行的程序难以阅读,应该尽量避免每个Java源文件都包含一个单一的公共类或接口.若私有类和接口与一个公共类相关联,可以将它们和公共类放入同一个源文件。公共类必须是这个文件中的第一个类或接口。开头注释所有的源文件都应该在开头有一个C语言风格的注释,其中列出类名、版本信息、日期和版权声明,例如:/**Classname**Versioninfo**Copyrightnotice*/缩进排版4个空格常被作为缩进排版的一个单位。缩进的确切解释并未详细指定(空格vs.制表符)。一个制表符等于8个空格(而非4个)。行长度尽量避免一行的长度超过80个字符,因为很多终端和工具不能很好处理之。注意用于文档中的例子应该使用更短的行长,长度一般不超过70个字符换行当一个表达式无法容纳在一行内时,可以依据如下一般规则断开之:-在一个逗号后面断开-在一个操作符前面断开-宁可选择较高级别(higher-level)的断开,而非较低级别(lower-level)的断开-新的一行应该与上一行同一级别表达式的开头处对齐-如果以上规则导致你的代码混乱或者使你的代码都堆挤在右边,那就代之以缩进8个空格。换行(例子)以下是断开方法调用的一些例子:function(longExpression1,longExpression2,longExpression3,longExpression4,longExpression5);var=function1(longExpression1,function2(longExpression2,longExpression3));断开方法调用的一些例子if语句的换行通常使用8个空格的规则,因为常规缩进(4个空格)会使语句体看起来比较费劲,例如:if((condition1&&condition2)||(condition3&&condition4)||!(condition5&&condition6)){//BADWRAPSdoSomethingAboutIt();//MAKETHISLINEEASYTOMISS}断开方法调用的一些例子推荐使用如下的断开方式if((condition1&&condition2)||(condition3&&condition4)||!(condition5&&condition6)){doSomethingAboutIt();}//或者使用如下方式if((condition1&&condition2)||(condition3&&condition4)||!(condition5&&condition6)){doSomethingAboutIt();}注释注释应被用来给出代码的总括,并提供代码自身没有提供的附加信息。注释应该仅包含与阅读和理解程序有关的信息。例如,相应的包如何被建立或位于哪个目录下之类的信息不应包括在注释中注释Java程序有两类注释:实现注释和文档注释。•实现注释是那些在C++中见过的,使用/*...*/和//界定的注释•文档注释是Java独有的,并由/**...*/界定。文档注释可以通过javadoc工具转换成HTML文件。文档注释从实现自由的角度描述代码的规范。它可以被那些手头没有源码的开发人员读懂。注释注释应被用来给出代码的总括,并提供代码自身没有提供的附加信息。在注释里,对设计决策中重要的或者不是显而易见的地方进行说明是可以的,但应避免提供代码中己清晰表达出来的重复信息。多余的的注释很容易过时。通常应避免那些代码更新就可能过时的注释。注意:频繁的注释有时反映出代码的低质量。当你觉得被迫要加注释的时候,考虑一下重写代码使其更清晰。注释不应写在用星号或其他字符画出来的大框里。注释不应包括诸如制表符和回退符之类的特殊字符。实现注释的格式程序可以有4种实现注释的风格:•块•单行•尾端•行末块注释块注释通常用于提供对文件,方法,数据结构和算法的描述。块注释被置于每个文件的开始处以及每个方法之前。它们也可以被用于其他地方,比如方法内部。在功能和方法内部的块注释应该和它们所描述的代码具有一样的缩进格式块注释之首应该有一个空行,用于把块注释和代码分割开来。块注释可以以/*-开头,这样indent(1)就可以将之识别为一个代码块的开始,而不会重排它比如:/**Hereisablockcomment.*/单行注释短注释可以显示在一行内,并与其后的代码具有一样的缩进层级如果一个注释不能在一行内写完,就该采用块注释单行注释之前应该有一个空行以下是一个Java代码中单行注释的例子if(condition){/*Handlethecondition.*/...}尾端注释极短的注释可以与它们所要描述的代码位于同一行,但是应该有足够的空白来分开代码和注释若有多个短注释出现于大段代码中,它们应该具有相同的缩进以下是一个Java代码中尾端注释的例子if(a==2){returnTRUE;/*specialcase*/}else{returnisprime(a);/*worksonlyforodda*/}行末注释注释界定符//,可以注释掉整行或者一行中的一部分它一般不用于连续多行的注释文本;然而,它可以用来注释掉连续多行的代码段三种风格的例子if(foo1){//Doadouble-flip....}elsereturnfalse;//Explainwhyhere.//if(bar1){//////Doatriple-flip.//...//}//else//returnfalse;文档注释若想了解更多,参见HowtoWriteDocCommentsforJavadoc,其中包含了有关文档注释标记的信息(@return,@param,@see)若想了解更多有关文档注释和javadoc的详细资料,参见javadoc的主页文档注释文档注释描述Java的类、接口、构造器,方法,以及字段(field)。每个文档注释都会被置于注释定界符/**...*/之中,一个注释对应一个类、接口或成员。该注释应位于声明之前:/***TheExampleclassprovides...*/publicclassExample{...注意顶层(top-level)的类和接口是不缩进的,而其成员是缩进的。描述类和接口的文档注释的第一行(/**)不需缩进;随后的文档注释每行都缩进1格(使星号纵向对齐)。成员,包括构造函数在内,其文档注释的第一行缩进4格,随后每行都缩进5格。若你想给出有关类、接口、变量或方法的信息,而这些信息又不适合写在文档中,则可使用实现块注释(见5.1.1)或紧跟在声明后面的单行注释(见5.1.2)。例如,有关一个类实现的细节,应放入紧跟在类声明后面的实现块注释中,而不是放在文档注释中。文档注释不能放在一个方法或构造器的定义块中,因为Java会将位于文档注释之后的第一个声明与其相关联声明推荐一行一个声明,因为这样以利于写注释,例如:intlevel;//indentationlevelintsize;//sizeoftable要优于intlevel,size;声明不要将不同类型变量的声明放在同一行,例如:intfoo,fooarray[];//WRONG!注意:上面的例子中,在类型和标识符之间放了一个空格,另一种被允许的替代方式是使用制表符:intlevel;//indentationlevelintsize;//sizeoftableObjectcurrentEntry;//currentlyselectedtableentry布局只在代码块的开始处声明变量。(一个块是指任何被包含在大括号{和}中间的代码。)不要在首次用到该变量时才声明之。这会把注意力不集中的程序员搞糊涂,同时会妨碍代码在该作用域内的可移植性。voidmyMethod(){intint1=0;//beginningofmethodblockif(condition){intint2=0;//beginningofifblock...}}该规则的一个例外是for循环的索引变量for(inti=0;imaxLoops;i++){...}布局避免声明的局部变量覆盖上一级声明的变量。例如,不要在内部代码块中声明相同的变量名:intcount;...myMethod(){if(condition){intcount=0;//AVOID!...}...}初始化尽量在声明局部变量的同时初始化。唯一不这么做的理由是变量的初始值依赖于某些先前发生的计算。类和接口的声明当编写类和接口时,应该遵守以下格式规则:-在方法名与其参数列表之前的左括号(间不要有空格-左大括号{位于声明语句同行的末尾-右大括号“}”另起一行,与相应的声明语句对齐,除非是一个空语句,“}”应紧跟在“{”之后-方法与方法之间以空行分隔类和接口的声明classSampleextendsObject{intivar1;intivar2;Sample(inti,intj){ivar1=i;ivar2=j;}intemptyMethod(){}...}语句简单语句每行至多包含一条语句,例如:argv++;//Correctargc--;//Correctargv++;argc--;//AVOID!复合语句复合语句是包含在大括号中的语句序列,形如{语句}。例如下面各段。-被括其中的语句应该较之复合语句缩进一个层次-左大括号{应位于复合语句起始行的行尾;右大括号}应另起一行并与复合语句首行对齐。-大括号可以被用于所有语句,包括单个语句,只要这些语句是诸如if-else或for控制结构的一部分。这样便于添加语句而无需担心由于忘了加括号而引入bug。返回语句一个带返回值的return语句不使用小括号(),除非它们以某种方式使返回值更为显见。例如:return;returnmyDisk.size();return(size?size:defaultSize);if,if-else,ifelse-ifelse语句(if,if-else,ifelse-ifelseStatements)if-else语句应该具有如下格式:if(condition){statements;}if(condition){statements;}else{statements;}if(condition){statements;}elseif(condition){statements;}else{statements;}if,if-else,ifelse-ifelse语句(if,if-else,ifelse-ifelseStatements)注意:if语句总是用{和}括起来,避免使用如下容易引起错误的格式:if(condition)//AVOID!THISOMITSTHEBRACES{}!statement;空行空行将逻辑相关的代码段分隔开,以提高可读性。下列情况应该总是使用两个空行:-一个源文件的两个片段(section)之间-类声明和接口声明之间下列情况应该总是使用一个空行:-两个方法之间-方法内的局部变量和方法的第一条语句之间-块注释或单行注释之前-一个方法内的两个