《JAVA代码规范详细版.docx》由会员分享,可在线阅读,更多相关《JAVA代码规范详细版.docx(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品word 可编辑资料 - - - - - - - - - - - - -JAVA代码规范本 Java 代码规范以SUN 的标准 Java 代码规范为基础,为适应我们公司的实际需要,可能会做一些修改; 本文档中没有说明的地方,请参看 SUN Java标准代码规范; 假如两边有冲突,以 SUN Java标准为准;1. 标识符命名规范1.1 概述标识符的命名力求做到统一、达意和简洁;1.1.1 统一统一是指,对于同一个概念,在程序中用同一种表示方法,比如对于供应商,既可以用supplier ,也可以用provider ,但是我们只能选定一个使用,至少在一个Java 项目中保持统一;统一是作为重要
2、的,假如对同一概念有不同的表示方法,会使代码纷乱难以懂得;即使不能取得好的名称,但是只要统一,阅读起来也不会太困难,由于阅读者只要懂得一次;1.1.2 达意达意是指,标识符能精确的表达出它所代表的意义,比如:newSupplier,OrderPaymentGatewayService等;而supplier1, service2, idtts 等就不是好的命名方式;精确有两成含义,一是正确,而是丰富;假如给一个代表供应商的变量起名是order ,明显没有正确表达;同样的,supplier1,远没有 targetSupplier意义丰富;1.1.3 简洁简洁是指,在统一和达意的前提下,用完量少的标
3、识符;假如不能达意,宁愿不要简洁;比如: theOrderNameOfTheTargetSupplierWhichIsTransfered太长,transferedTargetSupplierOrderName就较好,但是transTgtSplOrdNm就不好了;省略元音的缩写方式不要使用,我们的英语往往仍没有好到看得懂古怪的缩写;1.1.4 骆驼法就Java 中,除了包名,静态常量等特别情形,大部分情形下标识符使用骆驼法就,即单词之间不使用特别符号分割,而是通过首字母大写来分割;比如: supplierName, addNewContract,而不是supplier_name, add_ne
4、w_contract;第 1 页,共 15 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -1.1.5 英文vs拼音尽量使用通俗易懂的英文单词,假如不会可以向队友求助,实在不行就使用汉语拼音,防止拼音与英文混用;比如表示归档,用archive 比较好 , 用 pigeonhole就不好,用guiDang 尚可接受;1.2 包名使用小写字母如com.xxx.settlment,不要com.xxx.Settlement单词间不要用字符隔开,比如com.xxx.settlment.jsfutil,而不要 com.xxx.settl
5、ement.jsf_util1.3 类名1.3.1 首字母大写类名要首字母大写,比如SupplierService, PaymentOrderAction;不要supplierService, paymentOrderAction.1.3.2 后缀类名往往用不同的后缀表达额外的意思,如下表:后缀名意义举例Service说明这个类是个服务类,里面包含了给其他类提同PaymentOrderService业务服务的方法Impl这个类是一个实现类,而不是接口PaymentOrderServiceImplInter这个类是一个接口LifeCycleInterDao这个类封装了数据拜访方法PaymentO
6、rderDaoAction直接处理页面恳求,治理页面规律了类UpdateOrderListActionListener响应某种大事的类PaymentSuccessListenerEvent这个类代表了某种大事PaymentSuccessEventServlet一个 ServletPaymentCallbackServletFactory生成某种对象工厂的类PaymentOrderFactoryAdapter用来连接某种以前不被支持的对象的类DatabaseLogAdapterJob某种按时间运行的任务PaymentOrderCancelJobWrapper这是一个包装类,为了给某个类供应没有的
7、才能SelectableOrderListWrapper第 2 页,共 15 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -Bean这是一个POJOMenuStateBean1.4 方法名首字母小写,如addOrder()不要AddOrder() 动词在前,如addOrder() ,不要 orderAdd() 动词前缀往往表达特定的含义,如下表:前缀名意义举例create创建createOrder()delete删除deleteOrder()add创建,示意新创建的对象属于某个集合addPaidOrder()remove删
8、除removeOrder()init 或就initialize初始化, 示意会做些诸如猎取资源等特别动作initializeObjectPooldestroy销毁,示意会做些诸如释放资源的特别动destroyObjectPool作open打开openConnection()close关闭closeConnection()0 )System . out . println( arg ) ;第 5 页,共 15 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -for( inti=0 ;ib)/do something here
9、;2.6.2.2 二元三元运算符两边用一个空格隔开如下:a+ b= c ;第 6 页,共 15 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -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空行的使用空行可以表达代码在语义上的分割,注释的作用范畴,等等;将类似操作,或一组操作放在一起不用空行隔开,而用空行隔开
10、不同组的代码,如图:order= orderDao.findOrderById( id ) ;/update propertiesorder.setUserName( userName ) ; order.setPrice( 456 ) ;order.setStatus( PAID ) ;orderService.updateTotalAmount( order) ;session.saveOrUpdate( order) ;上例中的空行,使注释的作用域很明显.连续两行的空行代表更大的语义分割;方法之间用空行分割域之间用空行分割超过十行的代码假如仍不用空行分割,就会增加阅读困难第 7 页,共
11、15 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -3. 注释规范3.1 注释 vs代码注释宜少二精,不宜多而滥,更不能误导命名达意,结构清楚,类和方法等责任明确,往往不需要,或者只需要很少注释,就可以让人读懂;相反,代码纷乱,再多的注释都不能补偿;所以,应当先在代码本 身下功夫;不能正确表达代码意义的注释,只会损害代码的可读性;过于具体的注释,对显而易见的代码添加的注释,罗嗦的注释,仍不如不写;注释要和代码同步,过多的注释会成为开发的负担注释不是用来治理代码版本的,假如有代码不要了,直接删除,svn 会有记录的,不要注释
12、掉,否就以后没人知道那段注释掉的代码该不该删除;3.2 Java Doc说明类、域和方法等的意义和用法等的注释,要以javadoc的方式来写; Java Doc是个类的使用者来看的, 主要介绍是什么, 怎么用等信息; 凡是类的使用者需要知道,都要用 JavaDoc来写;非 Java Doc的注释, 往往是个代码的保护者看的,着重告述读者为什么这样写,如何修改,留意什么问题等;如下:/* This is a class comment*/publicclassTestClass/* This is a field comment*/publicStringname ;/* This is a m
13、ethod comment*/publicvoidcall()第 8 页,共 15 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -3.3 块级别注释3.3.1 块级别注释,单行时用/, 多行时用/* . */ ;3.3.2 较短的代码块用空行表示注释作用域3.3.3 较长的代码块要用/*- start: -*/和/*- end: -*/包围如:/*-start:订单处理 - */取得 daoOrderDao dao= Factory.getDao( OrderDao) ;/*查询订单 */Order order= dao.
14、findById( 456 ) ;/更新订单order.setUserName( uu) ; order.setPassword( pass) ; order.setPrice( ddd) ; orderDao.save ( order) ;/*-end:订单处理 - */3.3.4 可以考虑使用大括号来表示注释范畴使用大括号表示注释作用范畴的例子:/*-订单处理 - */取得 daoOrderDao dao= Factory.getDao( OrderDao) ;第 9 页,共 15 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - -
15、- - -/*查询订单 */Order order= dao.findById( 456 ) ;/更新订单order.setUserName( uu) ; order.setPassword( pass) ; order.setPrice( ddd) ;orderDao.save ( order) ;3.4 行内注释行内注释用/ 写在行尾4 正确实践和禁忌4.1 每次储存的时候,都让你的代码是最美的程序员都是懒散的,不要想着等我完成了功能,再来优化代码的格式和结构,等真的把功能完成,很少有人会再情愿回头调整代码;4.2 使用 log而不是 System.out.println()log 可以设
16、定级别,可以掌握输出到哪里,简洁区分是在代码的什么地方打印的,而System.out.print就不行; 而且, System.out.print的速度很慢; 所以, 除非是有意的, 否就,都要用 log ;至少在提交到svn 之前把 System.out.print换成 log ;4.3 每个 if while for等语句,都不要省略大括号看下面的代码:if( a b ) a+;假如在以后保护的时候,需要在a b时,把 b+ ,一步当心就会写成:if( a b ) a+;b+;这样就错了,由于无论a 和 b 是什么关系,b+ 都会执行;假如一开头就这样写:第 10 页,共 15 页 - -
17、 - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -if( a b ) a+;信任没有哪个笨蛋会把b+ 添加错的; 而且, 这个大括号使作用范畴更明显,特别是后面那行很长要折行时;4.4 善用 TODO:在代码中加入/TODO:,大部分的ide 都会帮你提示,让你知道你仍有什么事没有做;比如:if( order.isPaid()/TODO:更新订单4.5 在需要留空的地方放一个空语句或注释,告述读者,你是有意的比如:if( . exists( order);或:if( . exists( order)/nothing to do4.6 不
18、要再对 boolean值做 true false判定比如:if( order.isPaid()=true)/ Do something here不如写成:if( order.isPaid()/Do something here后者读起来就很是if order is paid,易懂得要.比if orders isPaid method returns true,更容 第 11 页,共 15 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -4.7 削减代码嵌套层次代码嵌套层次达3 层以上时,一般人懂得起来都会困难;下面的代码是一
19、个简洁的例子:publicvoiddemo ( inta,intb,intc ) if( a b )if( b c )doJobA();elseif( b c )if( a b& b c )doJobA();if( a b& c b ) doJobB();if( a= b& c b& a b )if( b c )doJobA(); return;doJobB()return;if( b c )if( a c )doJobC();利用子方法,就是将嵌套的程序提取出来放到另外的方法里;4.8 程序职责单一关注点分别是软件开发的真理;人类自所以能够完成复杂的工作,就是由于人类能够将工作 分解到较小级
20、别的任务上,在做每个任务时关注更少的东西;让程序单元的职责单一,可以使你在编写这段程序时关注更少的东西,从而降低难度,削减出错;4.9 变量的声明,初始化和被使用完量放到一起比方说如下代码:intorderNum= getOrderNum();/do something withou orderNum here call( orderNum) ;上例中的注释处代表了一段和orderNum不相关的代码;orderNum的声明和初始化离被使用的地方相隔了许多行的代码,这样做不好,不如这样:/do something withou orderNum here intorderNum= getOrde
21、rNum(); call( orderNum) ;4.10 缩小变量的作用域第 13 页,共 15 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -能用局部变量的,不要使用实例变量,能用实例变量的, 不要使用类变量; 变量的生存期越短,以为着它被误用的机会越小, 同一时刻程序员要关注的变量的状态越少; 实例变量和类变量默认都不是线程安全的,局部变量是线程安全的;比如如下代码:publicclassOrderPayAction privateOrder order;publicvoiddoAction()order= orde
22、rDao.findOrder(); doJob1();doJob2();privatevoiddoJob1() doSomething( order) ;privatevoiddoJob2() doOtherThing( order) ;上例中 order 只不过担当了在方法间传递参数之用,用下面的方法更好:publicclassOrderPayAction publicvoiddoAction()order= orderDao.findOrder();doJob1( order) ;doJob2( order) ;privatevoiddoSomethingdoJob1( order( Or
23、der order) ;)privatevoiddoJob2( Order order) doOtherThing( order) ;第 14 页,共 15 页 - - - - - - - - - -精品word 可编辑资料 - - - - - - - - - - - - -4.11 尽量不要用参数来带回方法运算结果比如:publicvoidcalculate( Order order) intresult=0 ;/do lots of computing and store it in the resultorder.setResult( result) ;publicvoidaction(
24、)order= orderDao.findOrder(); calculate( order) ;/ do lots of things about order例子中 calculate方法通过传入的order 对象来储备结果,不如如下写:publicintcalculate( Order order) intresult=0 ;/do lots of computing and store it in the result returnresult;publicvoidaction()order= orderDao.findOrder();order.setResult( calculate( order);/ do lots of things about order第 15 页,共 15 页 - - - - - - - - - -