Java编程规范参考.docx
- 文档编号:30192378
- 上传时间:2023-08-07
- 格式:DOCX
- 页数:16
- 大小:21.51KB
Java编程规范参考.docx
《Java编程规范参考.docx》由会员分享,可在线阅读,更多相关《Java编程规范参考.docx(16页珍藏版)》请在冰豆网上搜索。
Java编程规范参考
Java编码规范
制定本编程格式的目的是为了使软件可读性好、兼容性好、易维护等等。
注:
加(*)者为重要保证要求。
一、命名规范
1.1Package的命名(*)
Package的名字应由一个小写单词组成。
为了保证包的唯一性,一般以公司国际域名开头。
例如:
com.elanbase.db。
1.2Class的命名(*)
Class的名字必须由大写字母开头,并且其它单词的首写字母也要大写。
例如:
DbAccess。
1.3Class成员属性及变量的命名(*)
变量/成员属性的名字用一个小写字母开头,后面的单词以大写字母开头。
例如:
privateStringlastName;
1.4常量的命名(*)
Java里的常量,是用staticfinal修饰的,应该用全大写加下划线命名,并且常量名应尽量指出
完整含义。
如:
publicstaticfinalStringORACLE_DB_DRIVER="oracle.jdbc.driver.OracleDriver";
1.5数组的命名
数组应该总是用下面的形式来命名:
byte[]buffs;
而不是:
bytebuffs[];
1.6方法的参数
和变量的命名规范一致,且应使用有意义的参数命名,如果可能的话,使用和要赋值的
属性一样的名字,如:
setCounter(intsize){
this.size=size;
}
1.7方法命名(*)
用一个小写字母开头,后面的单词以大写字母开头。
应意义明确,对于属性的存取方法,
应使用getXXX()和setXXX()名称,以isXXX(),hasXXX()来命名返回值为boolean类型的
方法。
1.8一般命名注意事项
a.用有意义的名字命名变量
首先,用完整的英语单词或约定俗成的简写命名变量,鼓励多用约定俗成的简写命名变量。
例如:
publicStringzipCode
publicinterrNo
b.用复数命名Collection类变量
Collection,包括数组,Vector等。
命名时使用复数:
例如:
publicCollectioncustomers
二、Java源文件样式
Java(*.java)源文件应遵守如下的样式规则
2.1Class代码布局:
package
Javadoc注释或者其它文件头注释
类声明
Fields声明
空行
构造函数
空行
克隆方法
空行
其它方法(不包括main)
空行
内部(Inner)类
空行
main()方法
2.2版权信息
版权信息必须在java文件的开头,
例如:
/**
*
Title:
编码过滤器
*
Description:
该类实现把request请求编码为web.xml文件中所配置的字符集
*
Copyright:
Copyright(c)2003
*
Company:
华软软件学院
*@authorweiowen
*@version1.0
*/
2.3Package/Imports(*)
package行要在版权信息之前,中间空一行。
将import的classes归类,按顺序罗列:
a.Java标准类(java.*)
b.Java扩充类(javax.*)
c.第三方类
d.你的应用程序的类
每一类空一行。
注意在第三方类里进行注释,说明它们的来源。
如果import行中包含了同一个包中的
多个类,不推荐用importpakage.*来处理,推荐把要用的类一一import出来。
这样程序
用到哪些类就可以非常清楚的看出来,有利于代码的维护,增强了代码的可读性。
例如:
importjava.util.Observable;
importjava.util.Date;
importjavax.sql.Connection;
//ApacheXerces
importorg.apache.xml.*;
importorg.apache.xerces.dom.*;
//Applicationclasses
importcom.elanbase.db.DbAccess
2.4ClassFields
类的成员变量:
/**
*Packetcounters
*/
protectedint[]packets;
public的成员变量必须以生成文档(JavaDoc)的方式进行注释(/**…*/)。
protected、
private和package定义的成员变量如果名字含义明确的话,可以没有注释。
Field定义可遵从以下顺序:
a.public常量
b.public变量
c.protected常量
d.protected变量
e.package常量
f.package变量
g.private常量
h.private变量
2.5存取方法(getter,setter)
接下来是类成员变量的存取的方法。
2.6构造方法(*)
重载的构造方法应该用递增的方式写(参数多的写在后面)。
publicCounterSet(){
this(10);
}
publicCounterSet(intsize){
this.size=size;
}
2.7克隆方法
如果这个类是可以被克隆的,就应实现clone方法:
publicObjectclone(){
try{
CounterSetobj=(CounterSet)super.clone();
obj.packets=(int[])packets.clone();
obj.size=size;
returnobj;
}catch(CloneNotSupportedExceptione){
thrownewInternalError("UnexpectedCloneNotSUpportedException:
"+
e.getMessage());
}
}
2.8类方法
下面开始写类方法:
/**
*Setthepacketcounters
*(suchaswhenrestoringfromadatabase)
*/
protectedfinalvoidsetArray(int[]r1,int[]r2,int[]r3,int[]r4)
throwsIllegalArgumentException{
//
//Ensurethearraysareofequalsize
//
if(r1.length!
=r2.length||r1.length!
=r3.length||r1.length!
=
r4.length)
thrownewIllegalArgumentException("Arraysmustbeofthesamesize");
System.arraycopy(r1,0,r3,0,r1.length);
System.arraycopy(r2,0,r4,0,r1.length);
}
2.9toString方法
每一个类都最好定义toString方法:
publicStringtoString(){
Stringretval="CounterSet:
";
for(inti=0;i retval+=data.bytes.toString(); retval+=data.packets.toString(); } returnretval; } 2.10main方法(*) 如果类中包含main(String[])方法,那么它应该写在类的底部。 三、代码编写风格 3.1代码格式 代码应该用unix的格式,而不是windows的(比如: 回车变成回车+换行)。 3.2文档化(*) 必须遵守javadoc风格来为源程序写注释。 不仅因为它是标准,这也是被各种java编 译器都认可的方法。 3.3缩进(*) 缩进采用4个空格(2个太少不明显,8个太多占空间)。 不要在源文件中保存Tab 字符(! ! )。 在使用不同的源代码管理工具时Tab字符将因为用户设置的不同而显示为不同的 宽度。 例如: 在Jbuilder7中作如下设置: 在ToolsEditorOptionsEditor面板上修改BlockIndent为4,TabSize为4。 3.4行宽 行宽应该设置为80字符。 源代码一行一般不应超过这个宽度,这会导致无法完整显示。 但这一设置也可以灵活调整。 超长的语句应该在一个逗号后或者一个操作符前折行。 一条语 句折行后,应该根据实际情况进行缩进,总的原则是代码看起来清楚整洁。 3.5折行(*) 需要折行时应遵循如下原则: ·在逗号后。 ·在操作符前。 ·高级别优先(例1)。 ·第二行做两次缩进,第三行与第二行对齐。 例1: longName1=longName2*(longName3+longName4-longName5) +4*longname6;//推荐使用 longName1=longName2*(longName3+longName4 -longName5)+4*longname6;//避免使用 例2 //均缩进8个空格以避免很深的缩进 privatestaticsynchronizedhorkingLongMethodName(intanArg, ObjectanotherArg,StringyetAnotherArg, ObjectandStillAnother){ //下一层语句4空格缩进 } //避免此种缩进 if((condition1&&condition2) ||(condition3&&condition4) ||! (condition5&&condition6)){//此折行方式不佳 doSomethingAboutIt();//此行不易读 } //应用此种断行/缩进方式 if((condition1&&condition2) ||(condition3&&condition4) ||! (condition5&&condition6)){ doSomethingAboutIt(); } //或此种折行/缩进方式 if((condition1&&condition2)||(condition3&&condition4) ||! (condition5&&condition6)){ doSomethingAboutIt(); } 三重表达式可用以下缩进方式: alpha=(aLongBooleanExpression)? beta: gamma; 或: alpha=(aLongBooleanExpression)? beta : gamma; 或: alpha=(aLongBooleanExpression) ? beta : gamma; 3.6变量声明 推荐一行只写一行变量声明语句,这样有助于写注释。 如: intlevel;//indentationlevel intsize;//sizeoftable 是推荐的,而要避免: intlevel,size; 的写法。 此外,要杜绝不同类型变量写在一行的错误: intfoo,fooarray[]; 3.7{}对 {}中的语句应该单独作为一行,并采用如下风格: if(i>0){ i++; };//正确,{单独作为一行 不推荐使用: if(i>0){i++};//错误,{和}在同一行 或 if(i>0) {//错误,‘{’应在上一行末尾。 i++; } }语句永远单独作为一行。 3.8ifelse语句(*) 多条件连续判断语句应按以下格式书写: if(…){ … }elseif(…){ … }else{ … } 应注意if语句总应使用括号,要避免以下容易出错的写法: if(condition)//避免。 此处略去了{}! statement; 或 if(condition)statement; 3.9括号 左括号和后一个字符之间不应该出现空格,同样,右括号和前一个字符之间也不应该出 现空格。 下面的例子说明括号和空格的错误及正确使用: CallProc(AParameter);//错误 CallProc(AParameter);//正确 不要在语句中使用无意义的括号。 括号只应该为达到某种目的(如语法要求或增加程序 可读性)而出现在源代码中。 下面的例子说明错误和正确的用法: if((I)==42){//错误,括号毫无意义 if((I==42)or(J==42)){//正确,的确需要括号 3.10语句 每行只能包括一句代码。 如: argv++;//正确 argc--;//正确 argv++;argc--;//避免! 3.11使用空格 空格应依如下规则使用: 1.关键字与括号之间应加一空格(*),如: (while与小括号间有空格) while(true){ ... } 注意在方法名和左括号之间不应加空格,这样有助于区分关键字和方法调用。 2.参数列表中逗号后面应加一个空格(*)。 3.操作数与操作符之间应该加一空格,除了“.”操作符和一元操作符,即“++”和“—”。 (*)例: a+=c+d; a=(a+b)/(c*d); while(d++=s++){ n++; } printSize("sizeis"+foo+"\n"); 4.for语句中的表达式应以空格分开(*): for(expr1;expr2;expr3) 5.强制类型转换应加空格,如: myMethod((byte)aNum,(Object)x); myMethod((int)(cp+5),((int)(i+3)) +1); 四、程序编写规范 4.1使用方法来访问实例变量和类变量(*) 如果没有很好的理由,一般不应将实例变量或类变量设为public,将变量设为public 的典型应用是此类代表一个“数据结构”,而不包含任何方法。 4.2引用类变量和类方法(*) 避免使用对象引用来访问类(static)变量或类方法,而应使用类名来访问。 如: classMethod();//OK AClass.classMethod();//OK anObject.classMethod();//避免! 4.3常量(*) 数字常量不应直接在编码中出现,除非是for循环中用于计数的–1,0,或1。 字符串常量尽量不直接在编码中出现。 4.4? 前的逻辑运算表达式 ? 前的逻辑运算表达式应以括号括起,如: (x>=0)? x: -x; 4.5特殊注释 注释用XXX表示当前是伪码,但可以工作,用FIXME标记有问题的部分。 (UseXXXin acommenttoflagsomethingthatisbogusbutworks.UseFIXMEtoflagsomethingthat isbogusandbroken.) 4.6例外 申明的错误应该抛出一个RuntimeException或者派生的例外。 顶层的main()函数应该截获所有的例外,并且打印(或者记录在日志中)在屏幕上。 五、编程实践问题 5.1exit() exit除了在main中可以被调用外,其他的地方不应该调用。 因为这样做不给任何代 码机会来截获退出。 一个类似后台服务的程序不应该因为某一个库模块决定了要退出就退 出。 5.2垃圾收集 JAVA使用成熟的后台垃圾收集技术来代替引用计数。 但是这样会导致一个问题: 你必须在使用完对象的实例以后进行清场工作。 例如: FileOutputStreamfos=newFileOutputStream(projectFile); project.save(fos,"IDEProjectFile"); fos.close(); fos=null; 记住! 必须在使用完对象的实例以后将其关闭并且将其设置为null。 5.3final类 绝对不要因为性能的原因将类定义为final的(除非程序的框架要求) 如果一个类还没有准备好被继承,最好在类文档中注明,而不要将她定义为final的。 这是因为没有人可以保证会不会由于什么原因需要继承它。 5.4性能 在写代码的时候,从头至尾都应该考虑性能问题。 这不是说时间都应该浪费在优化代码 上,而是我们时刻应该提醒自己要注意代码的效率。 比如: 如果没有时间来实现一个高效的 算法,那么我们应该在文档中记录下来,以便在以后有空的时候再来实现她。 不是所有的人都同意在写代码的时候应该优化性能这个观点,他们认为性能优化的问题 应该在项目的后期再去考虑,也就是在程序的轮廓已经实现了以后。 应注意: ·不必要的对象构造 ·不要在循环中构造和释放对象 5.5使用StringBuffer对象 在处理String的时候要尽量使用StringBuffer类,StringBuffer类是构成String类的 基础。 String类将StringBuffer类封装了起来,(以花费更多时间为代价)为开发人员提供 了一个安全的接口。 当我们在构造字符串的时候,我们应该用StringBuffer来实现大部分 的工作,当工作完成后将StringBuffer对象再转换为需要的String对象。 比如: 如果有一 个字符串必须不断地在其后添加许多字符来完成构造,那么我们应该使用StringBuffer对 象和她的append()方法。 如果我们用String对象代替StringBuffer对象的话,会花费许 多不必要的创建和释放对象的CPU时间。 5.6换行 如果需要换行的话,尽量用println来代替在字符串中使用"\n"。 不要这样: System.out.print("Hello,world! \n"); 要这样: System.out.println("Hello,world! "); 或者你构造一个带换行符的字符串,至少要象这样: Stringnewline=System.getProperty("line.separator"); System.out.println("Helloworld"+newline);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 编程 规范 参考