JAVA代码规范详细版.docx
《JAVA代码规范详细版.docx》由会员分享,可在线阅读,更多相关《JAVA代码规范详细版.docx(15页珍藏版)》请在冰点文库上搜索。
JAVA代码规范详细版
JAVA代码规范
本Java代码规范以SUN的标准Java代码规范为基础,为适应我们公司的实际需要,可能会做一些修改。
本文档中没有说明的地方,请参看SUNJava标准代码规范。
如果两边有冲突,以SUNJava标准为准。
1.标识符命名规范
概述
标识符的命名力求做到统一、达意和简洁。
统一
统一是指,对于同一个概念,在程序中用同一种表示方法,比如对于供应商,既可以用supplier,也可以用provider,但是我们只能选定一个使用,至少在一个Java项目中保持统一。
统一是作为重要的,如果对同一概念有不同的表示方法,会使代码混乱难以理解。
即使不能取得好的名称,但是只要统一,阅读起来也不会太困难,因为阅读者只要理解一次。
达意
达意是指,标识符能准确的表达出它所代表的意义,比如:
newSupplier,OrderPaymentGatewayService等;而supplier1,service2,idtts等则不是好的命名方式。
准确有两成含义,一是正确,而是丰富。
如果给一个代表供应商的变量起名是order,显然没有正确表达。
同样的,supplier1,远没有targetSupplier意义丰富。
简洁
简洁是指,在统一和达意的前提下,用尽量少的标识符。
如果不能达意,宁愿不要简洁。
比如:
theOrderNameOfTheTargetSupplierWhichIsTransfered太长,transferedTargetSupplierOrderName则较好,但是transTgtSplOrdNm就不好了。
省略元音的缩写方式不要使用,我们的英语往往还没有好到看得懂奇怪的缩写。
"
骆驼法则
Java中,除了包名,静态常量等特殊情况,大部分情况下标识符使用骆驼法则,即单词之间不使用特殊符号分割,而是通过首字母大写来分割。
比如:
supplierName,addNewContract,而不是supplier_name,add_new_contract。
英文vs拼音
尽量使用通俗易懂的英文单词,如果不会可以向队友求助,实在不行则使用汉语拼音,避免拼音与英文混用。
比如表示归档,用archive比较好,用pigeonhole则不好,用guiDang尚可接受。
包名
使用小写字母如,不要
单词间不要用字符隔开,比如,而不要类名
首字母大写
类名要首字母大写,比如SupplierService,PaymentOrderAction;不要supplierService,paymentOrderAction.
后缀
类名往往用不同的后缀表达额外的意思,如下表:
后缀名
#
意义
举例
Service
表明这个类是个服务类,里面包含了给其他类提同业务服务的方法
PaymentOrderService
Impl
这个类是一个实现类,而不是接口
PaymentOrderServiceImpl
Inter
这个类是一个接口
LifeCycleInter
$
Dao
这个类封装了数据访问方法
PaymentOrderDao
Action
直接处理页面请求,管理页面逻辑了类
UpdateOrderListAction
Listener
响应某种事件的类
PaymentSuccessListener
Event
这个类代表了某种事件
{
PaymentSuccessEvent
Servlet
一个Servlet
PaymentCallbackServlet
Factory
生成某种对象工厂的类
PaymentOrderFactory
Adapter
用来连接某种以前不被支持的对象的类
DatabaseLogAdapter
Job
—
某种按时间运行的任务
PaymentOrderCancelJob
Wrapper
这是一个包装类,为了给某个类提供没有的能力
SelectableOrderListWrapper
Bean
这是一个POJO
MenuStateBean
方法名
首字母小写,如addOrder()不要AddOrder()
动词在前,如addOrder(),不要orderAdd()
动词前缀往往表达特定的含义,如下表:
前缀名
@
意义
举例
create
创建
createOrder()
delete
删除
deleteOrder()
add
创建,暗示新创建的对象属于某个集合
addPaidOrder()
?
remove
删除
removeOrder()
init或则initialize
初始化,暗示会做些诸如获取资源等特殊动作
initializeObjectPool
destroy
销毁,暗示会做些诸如释放资源的特殊动作
destroyObjectPool
open
打开
&
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,345)
域(field)名
静态常量
全大写用下划线分割,如
publicstaticfindStringORDER_PAID_EVENT=“ORDER_PAID_EVENT”;
枚举
全大写,用下划线分割,如
publicenumEvents{
ORDER_PAID,
ORDER_CREATED
}
其他
首字母小写,骆驼法则,如:
publicStringorderName;
【
局部变量名
参数和局部变量名首字母小写,骆驼法则。
尽量不要和域冲突,尽量表达这个变量在方法中的意义。
2.代码格式
用空格字符缩进源代码,不要用tab,每个缩进4个空格。
源文件编码
源文件使用utf-8编码,结尾用unixn分格。
行宽
行宽度不要超过80。
Eclipse标准
包的导入
删除不用的导入,尽量不要使用整个包的导入。
在eclipse下经常使用快捷键ctrl+shift+o修正导入。
类格式
·
域格式
每行只能声明一个域。
域的声明用空行隔开。
方法格式
代码块格式
缩进风格
大括号的开始在代码块开始的行尾,闭合在和代码块同一缩进的行首,例如:
package;
publicclassTestStyleextendsSomeClassimplementsAppleInter,BananaInter{
publicstaticfinalStringTHIS_IS_CONST="CONSTVALUE";
!
privatestaticvoidmain(String[]args){
intlocalVariable=0;
}
publicvoidcompute(Stringarg){
if()>0){
}
for(inti=0;i<10;i++){
}
.
while(condition){
}
do{
otherMethod();
}while(condition);
switch(i){
case0:
callFunction();
{
break;
case1:
callFunctionb();
break;
default:
break;
}
}
}
空格的使用
表示分割时用一个空格
!
不能这样:
if(a>b){
连续两行的空行代表更大的语义分割。
方法之间用空行分割
域之间用空行分割
超过十行的代码如果还不用空行分割,就会增加阅读困难
3.注释规范
注释vs代码
注释宜少二精,不宜多而滥,更不能误导
命名达意,结构清晰,类和方法等责任明确,往往不需要,或者只需要很少注释,就可以让人读懂;相反,代码混乱,再多的注释都不能弥补。
所以,应当先在代码本身下功夫。
不能正确表达代码意义的注释,只会损害代码的可读性。
《
过于详细的注释,对显而易见的代码添加的注释,罗嗦的注释,还不如不写。
注释要和代码同步,过多的注释会成为开发的负担
注释不是用来管理代码版本的,如果有代码不要了,直接删除,svn会有记录的,不要注释掉,否则以后没人知道那段注释掉的代码该不该删除。
JavaDoc
表明类、域和方法等的意义和用法等的注释,要以javadoc的方式来写。
JavaDoc是个类的使用者来看的,主要介绍是什么,怎么用等信息。
凡是类的使用者需要知道,都要用JavaDoc来写。
非JavaDoc的注释,往往是个代码的维护者看的,着重告述读者为什么这样写,如何修改,注意什么问题等。
如下:
/**
*Thisisaclasscomment
*/
publicclassTestClass{
/**
*Thisisafieldcomment
}
*/
publicStringname;
/**
*Thisisamethodcomment
*/
publicvoidcall(){
}
}
块级别注释
#
块级别注释,单行时用*/。
较短的代码块用空行表示注释作用域
较长的代码块要用
/*------start:
------*/
和
/*--------end:
-------*/
包围
如:
/*----------start:
订单处理-------*/
要比iforder’sisPaidmethodreturnstrue,…更容易理解
减少代码嵌套层次
代码嵌套层次达3层以上时,一般人理解起来都会困难。
下面的代码是一个简单的例子:
、
publicvoiddemo(inta,intb,intc){
if(a>b){
if(b>c){
doJobA();
}elseif(bdoJobB()
}
}else{
if(b>c){
if(adoJobC();
|
}
}
}
}
减少嵌套的方法有很多:
合并条件
利用return以省略后面的else
利用子方法
比如上例,合并条件后成为:
publicvoiddemo(inta,intb,intc){
if(a>b&&b>c){
:
doJobA();
}
if(a>b&&c>b){
doJobB();
}
if(a<=b&&c
doJobC();
}
}
如果利用return则成为:
publicvoiddemo(inta,intb,intc){
<
if(a>b){
if(b>c){
doJobA();
return;
}
doJobB()
return;
}
if(b>c){
if(a$
doJobC();
}
}
}
利用子方法,就是将嵌套的程序提取出来放到另外的方法里。
程序职责单一
关注点分离是软件开发的真理。
人类自所以能够完成复杂的工作,就是因为人类能够将工作分解到较小级别的任务上,在做每个任务时关注更少的东西。
让程序单元的职责单一,可以使你在编写这段程序时关注更少的东西,从而降低难度,减少出错。
变量的声明,初始化和被使用尽量放到一起
比方说如下代码:
intorderNum=getOrderNum();
//dosomethingwithouorderNumhere
~
call(orderNum);
上例中的注释处代表了一段和orderNum不相关的代码。
orderNum的声明和初始化离被使用的地方相隔了很多行的代码,这样做不好,不如这样:
//dosomethingwithouorderNumhere
intorderNum=getOrderNum();
call(orderNum);
缩小变量的作用域
能用局部变量的,不要使用实例变量,能用实例变量的,不要使用类变量。
变量的生存期越短,以为着它被误用的机会越小,同一时刻程序员要关注的变量的状态越少。
实例变量和类变量默认都不是线程安全的,局部变量是线程安全的。
比如如下代码:
publicclassOrderPayAction{
privateOrderorder;
publicvoiddoAction(){
;
order=();
doJob1();
doJob2();
}
privatevoiddoJob1(){
doSomething(order);
}
privatevoiddoJob2(){
doOtherThing(order);
~
}
}
上例中order只不过担当了在方法间传递参数之用,用下面的方法更好:
publicclassOrderPayAction{
publicvoiddoAction(){
order=();
doJob1(order);
doJob2(order);
}
privatevoiddoJob1(Orderorder){
【
doSomething(order);
}
privatevoiddoJob2(Orderorder){
doOtherThing(order);
}
}
尽量不要用参数来带回方法运算结果
比如:
publicvoidcalculate(Orderorder){
intresult=0;
//dolotsofcomputingandstoreitintheresult
(result);
}
publicvoidaction(){
order=();
calculate(order);
//dolotsofthingsaboutorder
}
例子中calculate方法通过传入的order对象来存储结果,不如如下写:
publicintcalculate(Orderorder){
intresult=0;
//dolotsofcomputingandstoreitintheresult
returnresult;
}
publicvoidaction(){
order=();
(calculate(order));
//dolotsofthingsaboutorder
}