JAVA编码规范第1页1.一般规则编写能够良好执行的软件是重要的,很多其它因素也让职业的Java程序开发者所关切。所有好的软件都能良好的执行。但是一个优秀的软件,应该是用可预见的,鲁棒的,可维护的,可支持的,可扩展的风格来编写。1、坚持原有的风格当我们修改已有软件时,你的改动应该遵循原有的编码风格。不要在修改中引入一种新的编码风格,并且不要试图仅仅为了适应新的风格而去重写原有的软件。在一个源文件中使用两种不同的风格所产生的代码是很难阅读和理解的。仅仅为改变风格而去重写原有代码,将会导致代价昂贵的,却是可避免的错误的引入。2、坚持最小惊讶原则最小惊讶原则建议你应该避免做让你的软件用户感到惊讶的事情。这意味着你的软件所展示的交互和行为,应该是可预测的和前后一致的。如果不是这样,那么你的文档一定要清晰地标识,并且证明每一个独特的使用模式或行为模式是合理的。为了使用户在使用你的软件时遇到的意外最少,你应该在你的Java程序的设计、实现以及文档中强调以下几个特性:(page1)·简单性构建简单类和简单方法。决定你需要做多少工作,就能满足用户的需要。·清晰性确保每一个类、接口、方法、变量和对象都有明确的目的。阐明在什么地方,什么时候,为什么以及怎样使用它们。·完整性提供每一个合理用户可能希望的最小功能。创建完整的文档来记录所有的特征和功能。·一致性相似的实体在外观和行为上应该是相同的;不同的实体在外观和行为上应该是不同的。无论何时,只要可能就要创建并应用这些标准。·鲁棒性提供可预见的记录行为来响应错误和异常.不要隐瞒错误,更不要迫使用户来发现错误。3、坚持在第一时间把它做好把这些规则应用到你所编写的任何代码中,而不仅仅是产品级的代码。经常会有一段原型的或实验的代码进入你最终的产品,所以你要能预见这种事是可能发生的。即使你的代码不会成为产品,其他人仍可能去读它。任何看到你的代码的人,都会因为你能够从一开始就JAVA编码规范第2页始终如一地应用这些规则而欣赏你的专业水平和远见。(page2)4、记录任何与编码规范相违背的地方没有完美的标准,也没有普遍应用的标准。有时你会发现你会处在不得不违背规范的处境中。在你决定忽略一个规则之前,你应该首先确信你是知道这个规则为什么存在的,知道如果不应用这个规则会有什么样的后果。如果你决定你必须违背一个规则,那么你要记录你必须这么做的原因。(page3)(柳学铮译)JAVA编码规范第3页2.格式编排的约定5.缩进嵌套代码增强代码可读性的一种方法是将独立的语句分组为块语句,并且统一缩进每块程序的内容,用以从环境代码中分离其内容。如果你用Java的开发环境开发代码,那么就用开发环境中产生的缩进风格编写。如果你用手工编写代码,则用2个空格来确保程序的可读性,并且这并没有占多大空间:classMyClass{…voidfunction(intarg){……if(arg0){………for(intindex=0;index=arg;index++){………//…………}……}…}}除了要缩进块语句的内容,你还应该缩进后面加了标记的语句,使标记更容易被注意到:voidfunction(intarg){…loop:……for(intindex=0;index=arg;index++){………switch(index){(page5)……case0;………//……………breakloop;//exittheforstatement………default;…………//……………break;//exittheswitchstatement………}JAVA编码规范第4页…}}将每块程序开始的括号“{”设置在引入程序块的那一行语句的最后一个字符的位置上。将每个程序块的结束括号“}”单独放在一行,同引入程序块语句的那一行的第一个字符排成一列。下面的例子说明了这个规则是怎样应用于各种各样的Java定义和控制结构。Classdefinitions:publicclassMyClass{…}Innerclassdefinitions:publicclassOuterClass{…classInnerClass{…}…}Methoddefinitions:voidmethod(intj){…}Staticblocks:static{…}(page6)For-loopstatements:JAVA编码规范第5页for(inti=0;i=j;i++){…}Ifandelsestatements:if(j0){…}elseif(j0){…}else{…}Try,catch,andfinallyblocks:try{…}catch(Exceptione){…}finally{…}Switchstatements:switch(value){case0:…break;default:…break;}JAVA编码规范第6页Anonymousinnerclasses:button.addActionListener(newActionEventListener(){(page7)publicvoidactionPerformed(){…}})Whilestatements:while(++k=j){…}Do-whilestatements:do{…}while(++k=j);★如果你正在管理一个开发组,不要让他们成为选择各自缩进数量和风格的个别开发者。为团队制定一个标准的缩进策略。并且确保每个人都遵从这个标准。尽管你们的团队更喜欢三个甚至是四个空格,但是我们推荐的两个空格是当今最普遍的标准。6.截断长行现代的基于windows的程序编辑器能够容易的通过水平浏览处理长的源代码行。然而一个打印机必须截尾,回行或是在超过他的最大可打印行宽的分散的打印纸上打印。为了打印时确保你的源代码仍然可读,你应该将你的源代码的长度限定在你的打印环境支持的最大宽度内,典型的是80或132字符。首先,如果结果是超过你的最大允许行长的一行语句,则不要将多重语句表达式放在一个单行。如果表达式放在一行,如:(page8)(赵智译)doublex=Math.random();doubley=Math.random();//TooLong!JAVA编码规范第7页那么就引入一个新行来把这两条语句表达式放在不同的行上。doublex=Math.random();doubley=Math.random();第二,如果当一行因为包含一个复杂的表达式而太长时:doublelength=Math.sqrt(Math.pow(Math.random(),2.0)+Math.random(),2.0));//TooLong!那么就把这个表达式拆分成几个小一些的子表达式。使用单独的行,来存放由每个子表达式的等价转换,而成的临时变量所产生的结果:doublexSquared=Math.pow(Math.random(),2,0);doubleySquared=Math.pow(Math.random(),2,0);doublelength=Math.sqrt(xSquared+ySquared);最后,如果一个长行不能使用前面的两条规则来缩短,那么就用下面的规则来分开、回行、和缩进:第一步如果一行中的高层表达式包含一个或多个逗号:doublelength=Math.sqrt(Math.pow(x,2.0),Math.pow(y,2.0));//TooLong!那么在每个逗号后引入一个行中断。将每一个后面跟随着逗号的表达式,同逗号后面的表达式的第一个字符对齐:doublelength=Math.sqrt(Math.pow(x,2.0),Math.pow(y,2.0));第二步如果一行中的高层表达式中不包含逗号:classMyClass{privateintfield;(page9)…Booleanequals(objectobj){returnthis==obj||(objinstanceofMyClass&&this.field==obj.field);//TooLong!}JAVA编码规范第8页…}那么在最低优先级的操作符前引入一个行中断,或者如果存在多个具有同样低优先级的操作符时,在每个这样的操作符之前引入一个行中断。ClassMyClass{privateintfield;(page9)…Booleanequals(Objectobj){returnthis==obj||(this.objinstanceofMyClass&&this.field==obj.field);}…}第三步不断按照第一步和第二步所要求的那样进行分割,直到由原始语句表达式,所产生的每个行,都小于所允许的最大长度。7.包含空白的空间空白空间是一页中看不到字符的地方。由于有很少空白空间的代码难以阅读和理解,所以应使用大量的空白空间来清晰地画出方法、注释、代码区和表达式的轮廓。使用单个空格分隔:·在右边的括号“)”或大括号“}”与任何关键字之间要有一个空格;在任何关键字与大括号“{”或左边的括号“(”之间要有一个空格;在一个右括号“)”与左边的大括号“{”之间要有一个空格。(page10)for.(…).{…}while.(…).{…JAVA编码规范第9页}do.{…}.while.(…);switch.(…).{…}if.(…).{…}else.if.(…).{…}else.{…}try.{…}catch.(…).{…}finally.{…}(page11)·在任何二元操作符(除了那些被“.”限定的操作符、进行的表达式、直接跟着操作数的表达式)之间加入空格。JAVA编码规范第10页doublelength=Math.sqrt(x*x+y*y);doublexNorm=length0.0?(x/length):x;使用空行分隔:·在方法实现的每个逻辑区使用空行:voidhandleMessage(Messagemessage){DataInputcontent=message.getDataInput();intmessageType=content.readInt();switch(messageType){caseWARNING:…dosomestuffhere…break;caseERROR:…dosomestuffhere…break;default:…dosomestuffhere…break;}}·在类或接口中的成员定义的地方使用空行:publicclassFoo{/***Definesaninnerclass.JAVA编码规范第11页*/classInnerFoo{…}(page12)(田苗苗译)/***TheBarassociatedwiththisFoo.*/privateBarbar;/***ConstructaFoowiththespecifiedBar.*/Foo(Barbar){this.bar=bar;}}·在源文件中每一个类和接口定义的地方使用空行:/**…filedescription…*/packagecom.company.xyz;/***…interfacedescription…*/interfaceFooInterface{…JAVA编码规范第12页}/***…classdescription…*/publicclassFooimplementsFooInterface{…}8.不要使用tab键许多开发人员使用tab键来缩进和排列源代码,但他们没有意识到tab键的字符在不同的环境中会发生变化。在原始编译环境中浏览时,代码能够呈现出正确的格式编排。但当代码被转移到一个tab键字符有差异的编辑环境中时,将出现无格式编排的和不可读的情况。(page13)★为了避免这个问题,常用空格代替tab键来缩进和排列源代码。这个操作很简单,可以通过用空格键代替tab键或者通过配置编辑程序来代替tab键的实现。一些编译程序还提供了一个“智能的”缩进功能。但在