JAVA代码规范本Java代码规范以SUN的标准Java代码规范为基础,为适应我们公司的实际需要,可能会做一些修改。本文档中没有说明的地方,请参看SUNJava标准代码规范。如果两边有冲突,以SUNJava标准为准。1.标识符命名规范1.1概述标识符的命名力求做到统一、达意和简洁。1.1.1统一统一是指,对于同一个概念,在程序中用同一种表示方法,比如对于供应商,既可以用supplier,也可以用provider,但是我们只能选定一个使用,至少在一个Java项目中保持统一。统一是作为重要的,如果对同一概念有不同的表示方法,会使代码混乱难以理解。即使不能取得好的名称,但是只要统一,阅读起来也不会太困难,因为阅读者只要理解一次。1.1.2达意达意是指,标识符能准确的表达出它所代表的意义,比如:newSupplier,OrderPaymentGatewayService等;而supplier1,service2,idtts等则不是好的命名方式。准确有两成含义,一是正确,而是丰富。如果给一个代表供应商的变量起名是order,显然没有正确表达。同样的,supplier1,远没有targetSupplier意义丰富。1.1.3简洁简洁是指,在统一和达意的前提下,用尽量少的标识符。如果不能达意,宁愿不要简洁。比如:theOrderNameOfTheTargetSupplierWhichIsTransfered太长,transferedTargetSupplierOrderName则较好,但是transTgtSplOrdNm就不好了。省略元音的缩写方式不要使用,我们的英语往往还没有好到看得懂奇怪的缩写。1.1.4骆驼法则Java中,除了包名,静态常量等特殊情况,大部分情况下标识符使用骆驼法则,即单词之间不使用特殊符号分割,而是通过首字母大写来分割。比如:supplierName,addNewContract,而不是supplier_name,add_new_contract。1.1.5英文vs拼音尽量使用通俗易懂的英文单词,如果不会可以向队友求助,实在不行则使用汉语拼音,避免拼音与英文混用。比如表示归档,用archive比较好,用pigeonhole则不好,用guiDang尚可接受。1.2包名使用小写字母如com.xxx.settlment,不要com.xxx.Settlement单词间不要用字符隔开,比如com.xxx.settlment.jsfutil,而不要com.xxx.settlement.jsf_util1.3类名1.3.1首字母大写类名要首字母大写,比如SupplierService,PaymentOrderAction;不要supplierService,paymentOrderAction.1.3.2后缀类名往往用不同的后缀表达额外的意思,如下表:后缀名意义举例Service表明这个类是个服务类,里面包含了给其他类提同业务服务的方法PaymentOrderServiceImpl这个类是一个实现类,而不是接口PaymentOrderServiceImplInter这个类是一个接口LifeCycleInterDao这个类封装了数据访问方法PaymentOrderDaoAction直接处理页面请求,管理页面逻辑了类UpdateOrderListActionListener响应某种事件的类PaymentSuccessListenerEvent这个类代表了某种事件PaymentSuccessEventServlet一个ServletPaymentCallbackServletFactory生成某种对象工厂的类PaymentOrderFactoryAdapter用来连接某种以前不被支持的对象的类DatabaseLogAdapterJob某种按时间运行的任务PaymentOrderCancelJobWrapper这是一个包装类,为了给某个类提供没有的能力SelectableOrderListWrapperBean这是一个POJOMenuStateBean1.4方法名首字母小写,如addOrder()不要AddOrder()动词在前,如addOrder(),不要orderAdd()动词前缀往往表达特定的含义,如下表:前缀名意义举例create创建createOrder()delete删除deleteOrder()add创建,暗示新创建的对象属于某个集合addPaidOrder()remove删除removeOrder()init或则initialize初始化,暗示会做些诸如获取资源等特殊动作initializeObjectPooldestroy销毁,暗示会做些诸如释放资源的特殊动作destroyObjectPoolopen打开openConnection()close关闭closeConnection()read读取readUserName()write写入writeUserName()get获得getName()set设置setName()prepare准备prepareOrderList()copy复制copyCustomerList()modity修改modifyActualTotalAmount()calculate数值计算calculateCommission()do执行某个过程或流程doOrderCancelJob()dispatch判断程序流程转向dispatchUserRequest()start开始startOrderProcessing()stop结束stopOrderProcessing()send发送某个消息或事件sendOrderPaidMessage()receive接受消息或时间receiveOrderPaidMessgae()respond响应用户动作responseOrderListItemClicked()find查找对象findNewSupplier()update更新对象updateCommission()find方法在业务层尽量表达业务含义,比如findUnsettledOrders(),查询未结算订单,而不要findOrdersByStatus()。数据访问层,find,update等方法可以表达要执行的sql,比如findByStatusAndSupplierIdOrderByName(Status.PAID,345)1.5域(field)名1.5.1静态常量全大写用下划线分割,如publicstaticfindStringORDER_PAID_EVENT=“ORDER_PAID_EVENT”;1.5.2枚举全大写,用下划线分割,如publicenumEvents{ORDER_PAID,ORDER_CREATED}1.5.3其他首字母小写,骆驼法则,如:publicStringorderName;1.6局部变量名参数和局部变量名首字母小写,骆驼法则。尽量不要和域冲突,尽量表达这个变量在方法中的意义。2.代码格式用空格字符缩进源代码,不要用tab,每个缩进4个空格。2.1源文件编码源文件使用utf-8编码,结尾用unixn分格。2.2行宽行宽度不要超过80。Eclipse标准2.3包的导入删除不用的导入,尽量不要使用整个包的导入。在eclipse下经常使用快捷键ctrl+shift+o修正导入。2.4类格式2.5域格式每行只能声明一个域。域的声明用空行隔开。2.5方法格式2.6代码块格式2.6.1缩进风格大括号的开始在代码块开始的行尾,闭合在和代码块同一缩进的行首,例如:packagecom.test;publicclassTestStyleextendsSomeClassimplementsAppleInter,BananaInter{publicstaticfinalStringTHIS_IS_CONST=CONSTVALUE;privatestaticvoidmain(String[]args){intlocalVariable=0;}publicvoidcompute(Stringarg){if(arg.length()0){System.out.println(arg);}for(inti=0;i10;i++){System.out.println(arg);}while(condition){}do{otherMethod();}while(condition);switch(i){case0:callFunction();break;case1:callFunctionb();break;default:break;}}}2.6.2空格的使用2.6.2.1表示分割时用一个空格不能这样:if(ab){//dosomethinghere};2.6.2.2二元三元运算符两边用一个空格隔开如下:a+b=c;b-d=e;returna==b?1:0;不能如下:a+b=c;b-d=e;returna==b?1:0;2.6.2.3逗号语句后如不还行,紧跟一个空格如下:call(a,b,c);不能如下:call(a,b,c);2.6.3空行的使用空行可以表达代码在语义上的分割,注释的作用范围,等等。将类似操作,或一组操作放在一起不用空行隔开,而用空行隔开不同组的代码,如图:order=orderDao.findOrderById(id);//updatepropertiesorder.setUserName(userName);order.setPrice(456);order.setStatus(PAID);orderService.updateTotalAmount(order);session.saveOrUpdate(order);上例中的空行,使注释的作用域很明显.连续两行的空行代表更大的语义分割。方法之间用空行分割域之间用空行分割超过十行的代码如果还不用空行分割,就会增加阅读困难3.注释规范3.1注释vs代码注释宜少二精,不宜多而滥,更不能误导命名达意,结构清晰,类和方法等责任明确,往往不需要,或者只需要很少注释,就可以让人读懂;相反,代码混乱,再多的注释都不能弥补。所以,应当先在代码本身下功夫。不能正确表达代码意义的注释,只会损害代码的可读性。过于详细的注释,对显而易见的代码添加的注释,罗嗦的注释,还不如不写。注释要和代码同步,过多的注释会成为开发的负担注释不是用来管理代码版本的,如果有代码不要了,直接删除,svn会有记录的,不要注释掉,否则以后没人知道那段注释掉的代码该不该删除。3.2JavaDoc表明类、域和方法等的意义和用法等的注释,要以javadoc的方式来写。JavaDoc是个类的使用者来看的,主要介绍是什么,怎么用等信息。凡是类的使用者需要知道,都要用JavaDoc来写。非JavaDoc的注释,往往是个代码的维护者看的,着重告述读者为什么这样写,如何修改,注意什么问题等。如下:/***Thisisaclasscomment*/publicclassTestClass{/***Thisisafieldcomment*/publicStringname;/***Thisisamethodcomment*/publicvoidcall(){}}3.3块级别注释3.3.1块级别注释,单行时用//,多行时用/*..*/。3.3.2较短的代码块用空行表示注释作用域3.3.3较长的代码块要用/*------start:------*/和/*--------end:-------*/包围如:/*----------start:订单处理-------*///取得daoOrderDaodao=Factory.getDao(OrderDao);/*查询订单*/Orderorder=dao.findById(456);//更新订单order.setUserName(uu);order.setPassword(pass);order.setPrice(dd