Java语言编程规范华为.docx
《Java语言编程规范华为.docx》由会员分享,可在线阅读,更多相关《Java语言编程规范华为.docx(51页珍藏版)》请在冰豆网上搜索。
Java语言编程规范华为
DKBA
华为技术有限公司企业技术规范
DKBA1040-2001.12
代替(DKBA200106-003)
Java语言编程规范
2001-12-XX发布2001-12-XX实施
华为技术有限公司发布
目次
前言.................................................................................3
1范围
11
2规范性引用文件
11
3术语和定义
11
4排版规范
12
4.1规则
12
1.*程序块要采用缩进风格编写,缩进的空格数为4个。
12
2.*分界符(如大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。
在函数体的开始、类和接口的定义、以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。
12
3.*较长的语句、表达式或参数(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
13
4.*不允许把多个短语句写在一行中,即一行只写一条语句
13
5.*if,for,do,while,case,switch,default等语句自占一行,且if,for,do,while等语句的执行语句无论多少都要加括号{}。
13
6.*相对独立的程序块之间、变量说明之后必须加空行。
13
7.*对齐只使用空格键,不使用TAB键。
14
8.*在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如.),后不应加空格。
14
4.2建议
15
1.类属性和类方法不要交叉放置,不同存取范围的属性或者方法也尽量不要交叉放置。
15
5注释规范
16
5.1规则
16
1.一般情况下,源程序有效注释量必须在30%以上。
16
2.包的注释:
包的注释写入一个名为package.html的HTML格式的说明文件放入当前路径。
16
3.包的注释内容:
简述本包的作用、详细描述本包的内容、产品模块名称和版本、公司版权。
16
4.文件注释:
文件注释写入文件头部,包名之前的位置。
16
5.文件注释内容:
版权说明、描述信息、生成日期、修改历史。
17
6.类和接口的注释:
该注释放在package关键字之后,class或者interface关键字之前。
18
7.类和接口的注释内容:
类的注释主要是一句话功能简述、功能详细描述,
18
8.类属性、公有和保护方法注释:
写在类属性、公有和保护方法上面。
19
9.成员变量注释内容:
成员变量的意义、目的、功能,可能被用到的地方。
19
10.公有和保护方法注释内容:
列出方法的一句话功能简述、功能详细描述、输入参数、输出参数、返回值、违例等。
19
11.对于方法内部用throw语句抛出的异常,必须在方法的注释中标明,对于所调用的其他方法所抛出的异常,选择主要的在注释中说明。
对于非RuntimeException,即throws子句声明会抛出的异常,必须在方法的注释中标明。
20
12.*注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
20
13.*注释与所描述内容进行同样的缩排。
20
14.*将注释与其上面的代码用空行隔开。
21
15.*对变量的定义和分支语句(条件分支、循环语句等)必须编写注释。
21
16.*对于switch语句下的case语句,如果因为特殊情况需要处理完一个case后进入下一个case处理,必须在该case语句处理完、下一个case语句前加上明确的注释。
21
17.*边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。
不再有用的注释要删除。
21
18.*注释的内容要清楚、明了,含义准确,防止注释二义性。
21
19.*避免在注释中使用缩写,特别是不常用缩写。
21
5.1建议
21
1.*避免在一行代码或表达式的中间插入注释。
22
2.*通过对函数或过程、变量、结构等正确的命名以及合理地组织代码的结构,使代码成为自注释的。
22
3.*在代码的功能、意图层次上进行注释,提供有用、额外的信息。
22
4.*在程序块的结束行右方加注释标记,以表明某程序块的结束。
22
5.*注释应考虑程序易读及外观排版的因素,使用的语言若是中、英兼有的,建议多使用中文,除非能用非常流利准确的英文表达。
22
6.方法内的单行注释使用//。
22
7.注释尽量使用中文注释和中文标点。
方法和类描述的第一句话尽量使用简洁明了的话概括一下功能,然后加以句号。
接下来的部分可以详细描述。
23
8.顺序实现流程的说明使用1、2、3、4在每个实现步骤部分的代码前面进行注释。
23
9.一些复杂的代码需要说明。
23
6命名规范
24
6.1规则
24
1.包名采用域后缀倒置的加上自定义的包名,采用小写字母。
在部门内部应该规划好包名的范围,防止产生冲突。
部门内部产品使用部门的名称加上模块名称。
产品线的产品使用产品的名称加上模块的名称。
24
2.类名和接口使用类意义完整的英文描述,每个英文单词的首字母使用大写、其余字母使用小写的大小写混合法。
24
3.方法名使用类意义完整的英文描述:
第一个单词的字母使用小写、剩余单词首字母大写其余字母小写的大小写混合法。
24
4.方法中,存取属性的方法采用setter和getter方法,动作方法采用动词和动宾结构。
24
5.属性名使用意义完整的英文描述:
第一个单词的字母使用小写、剩余单词首字母大写其余字母小写的大小写混合法。
属性名不能与方法名相同。
25
6.常量名使用全大写的英文描述,英文单词之间用下划线分隔开,并且使用finalstatic修饰。
25
7.属性名可以和公有方法参数相同,不能和局部变量相同,引用非静态成员变量时使用this引用,引用静态成员变量时使用类名引用。
25
6.2建议
25
1.常用组件类的命名以组件名加上组件类型名结尾。
25
2.如果函数名超过15个字母,可采用以去掉元音字母的方法或者以行业内约定俗成的缩写方式缩写函数名。
26
3.准确地确定成员函数的存取控制符号,不是必须使用public属性的,请使用protected,不是必须使用protected,请使用private。
26
4.含有集合意义的属性命名,尽量包含其复数的意义。
26
7编码规范
27
7.1规则
27
1.*明确方法功能,精确(而不是近似)地实现方法设计。
一个函数仅完成一件功能,即使简单功能也应该编写方法实现。
27
2.应明确规定对接口方法参数的合法性检查应由方法的调用者负责还是由接口方法本身负责,缺省是由方法调用者负责。
27
3.明确类的功能,精确(而不是近似)地实现类的设计。
一个类仅实现一组相近的功能。
27
4.所有的数据类必须重载toString()方法,返回该类有意义的内容。
27
5.数据库操作、IO操作等需要使用结束close()的对象必须在try-catch-finally的finally中close()。
27
6.异常捕获后,如果不对该异常进行处理,则应该纪录日志或者ex.printStackTrace()。
28
7.自己抛出的异常必须要填写详细的描述信息。
28
8.运行期异常使用RuntimeException的子类来表示,不用在可能抛出异常的方法声明上加throws子句。
非运行期异常是从Exception继承而来的,必须在方法声明上加throws子句。
29
9.在程序中使用异常处理还是使用错误返回码处理,根据是否有利于程序结构来确定,并且异常和错误码不应该混合使用,推荐使用异常。
29
10.*注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。
29
11.*避免使用不易理解的数字,用有意义的标识来替代。
涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的静态变量来代替。
29
12.数组声明的时候使用int[]index,而不要使用intindex[]。
30
13.调试代码的时候,不要使用System.out和System.err进行打印,应该使用一个包含统一开关的测试类进行统一打印。
30
14.用调测开关来切换软件的DEBUG版和正式版,而不要同时存在正式版本和DEBUG版本的不同源文件,以减少维护的难度。
30
7.2建议
30
1.记录异常不要保存exception.getMessage(),而要记录exception.toString()。
30
2.一个方法不应抛出太多类型的异常。
31
3.异常捕获尽量不要直接catch(Exceptionex),应该把异常细分处理。
31
4.*如果多段代码重复做同一件事情,那么在方法的划分上可能存在问题。
31
5.对于创建的主要的类,最好置入main()函数,包含用于测试那个类的代码。
31
6.集合中的数据如果不使用了应该及时释放,尤其是可重复使用的集合。
31
7.*源程序中关系较为紧密的代码应尽可能相邻。
31
8.*不要使用难懂的技巧性很高的语句,除非很有必要时。
31
8JTEST规范
32
8.1规则(1-2级)
32
1.在switch中每个case语句都应该包含break或者return。
32
2.不要使用空的for、if、while语句。
32
3.在运算中不要减小数据的精度。
32
4.switch语句中的case关键字要和后面的常量保持一个空格,switch语句中不要定义case之外的无用标签。
32
5.不要在if语句中使用等号=进行赋值操作。
32
6.静态成员或者方法使用类名访问,不使用句柄访问。
32
7.方法重载的时候,一定要注意方法名相同,避免类中使用两个非常相似的方法名。
32
8.不要在ComponentLponentResized()方法中调用serResize()方法。
32
9.不要覆盖父类的静态方法和私有方法。
32
10.不要覆盖父类的属性。
32
11.不要使用两级以上的内部类。
32
12.把内部类定义成私有类。
32
13.去掉接口中多余的定义(不使用public,abstract,static,final等,这是接口中默认的)。
32
14.不要定义不会被用到的局部变量、类私有属性、类私有方法和方法参数。
32
15.显式初始化所有的静态属性。
32
16.不要使用System.getenv()方法。
32
17.不要硬编码‘\n’和‘\r’作为换行符号。
32
18.不要直接使用里面的接口。
32
19.使用System.arraycopy(),不使用循环来复制数组。
32
20.避免不必要的instanceof比较运算和类造型运算。
32
21.不要在finalize()方法中删除监听器(Listeners)。
32
22.在finalize()方法中一定要调用super.finalize()方法。
32
23.在finalize()方法中的finally中调用super.finalize()方法。
32
24.进行字符转换的时候应该尽可能的较少临时变量。
32
25.使用ObjectStream的方法后,调用reset(),释放对象。
32
26.线程同步中,在循环里面使用条件测试(使用while(isWait)wait()代替if(isWait)wait())。
32
27.不掉用Thread类的resume(),suspend(),stop()方法。
32
28.减小单个方法的复杂度,使用的if,while,for,switch语句要在10个以内。
32
29.在Servlets中,重用JDBC连接的数据源。
32
30.减少在Sevlets中使用的同步方法。
32
31.不定义在包中没有被用到的友好属性、方法和类。
32
32.没有子类的友好类应该定义成final。
32
33.没有被覆盖的友好方法应该定义成final。
32
8.2建议(3级或以上)
33
1.为switch语句提供一个default选项。
33
2.不要在for循环体中对计数器的赋值。
33
3.不要给非公有类定义public构建器。
33
4.不要对浮点数进行比较运算,尤其是不要进行==,!
=运算,减少>,<运算。
33
5.实现equals()方法时,先用getClass()或者instanceof进行类型比较,通过后才能继续比较。
33
6.不要重载main()方法用作除入口以外的其他用途。
33
7.方法的参数名不要和类中的方法名相同。
33
8.除了构建器外,不要使用和类名相同的方法名。
33
9.不要定义Error和RuntimeException的子类,可以定义Exception的子类。
33
10.线程中需要实现run()方法。
33
11.使用equals()比较两个类的值是否相同。
33
12.字符串和数字运算结果相连接的时候,应该把数字运算部分用小括号括起来。
33
13.类中不要使用非私有(公有、保护和友好)的非静态属性。
33
14.在类中对于没有实现的接口,应该定义成抽象方法,类应该定义成抽象类。
(5级)
33
15.不要显式导入java.lang.*包;
33
16.初始化时不要使用类的非静态属性。
33
17.显式初始化所有的局部变量。
33
18.按照方法名把方法排序放置,同名合同类型的方法应该放在一起。
33
19.不要使用嵌套赋值,即在一个表达式中使用多个=。
33
20.不要在抽象类的构建器中调用抽象方法。
33
21.重载equals()方法的同时,也应该重载hashCode()方法。
33
22.工具类(Utility)不要定义构建器,包括私有构建器。
33
23.不要在switch中使用10个以上的case语句。
33
24.把main()方法放在类的最后。
33
25.声明方法违例的时候不要使用Exception,应该使用它的子类。
33
26.不要直接扔出一个Error,应该扔出它的子类。
33
27.在进行比较的时候,总是把常量放在同一边(都放在左边或者都放在右边)。
33
28.在可能的情况下,总是为类定义一个缺省的构建器。
33
29.在捕获违例的时候,不使用Exception,RuntimeException,Throwable,尽可能使用它们的子类。
33
30.在接口或者工具类中中定义常量。
(5级)
33
31.使用大写‘L’表示long常量。
(5级)
33
32.main()方法必须是publicstaticvoidmain(String[])。
(5级)
33
33.对返回类型为boolean的方法使用is开头,其它类型的不能使用。
33
34.对非boolean类型取值方法(getter)使用get开头,其它类型的不能使用。
33
35.对于设置值的方法(setter)使用set开头,其它类型的不能使用。
33
36.方法需要有同样数量参数的注释@param。
34
37.不要在注释中使用不支持的标记,如:
@unsupported。
34
38.不要使用Runtime.exec()方法。
34
39.不要自定义本地方法(nativemethod)。
34
40.使用尽量简洁的的运算符号。
34
41.使用集合时设置初始容量。
34
42.单个首字符的比较使用charAt()而不用startsWith()。
34
43.对于被除数或者被乘数为2的n次方的乘除运算使用移位运算符>>,<<。
34
44.一个字符的连接使用‘’而不使用“”,如:
Stringa=b+'c'。
34
45.不要在循环体内调用同步方法和使用try-catch块。
34
46.不要使用不必要的布尔值比较,如:
if(a.equals(b)),而不是if(a.equals(b)==true)。
34
47.常量字符串使用String,非常量字符串使用StringBuffer。
34
48.在循环条件判断的时候不要使用复杂的表达式。
34
49.对于“if(condition)do1;elsedo2;”语句使用条件操作符“if(condition)?
do1:
do2;”。
34
50.不要在循环体内定义变量。
34
51.使用StringBuffer的时候设置初始容量。
34
52.尽可能的使用局部变量进行运算。
34
53.尽可能少的使用‘!
’操作符。
(5级)
34
54.尽可能的对接口进行instanceof运算。
(5级)
34
55.不要使用Date[]而要使用long[]替代。
34
56.不要显式调用finalize()。
34
57.不要使用静态集合,其内存占用增长没有边界。
34
58.不要重复调用一个方法获取对象,使用局部变量重用对象。
34
59.线程同步中,使用notifyAll()代替notify()。
34
60.避免在同步方法中调用另一个同步方法造成的死锁。
34
61.非同步方法中不能调用wait(),notify()方法。
34
62.使用wait(),notify()代替while(),sleep()。
34
63.不要使用同步方法,使用同步块。
(5级)
34
64.把所有的公有方法定义为同步方法。
(5级)
34
65.实现的Runnable.run()方法必须是同步方法。
(5级)
34
66.一个只有abstract方法、finalstatic属性的类应该定义成接口。
34
67.在clone()方法中应该而且必须使用super.clone()而不是new。
34
68.常量必须定义为final。
34
69.在for循环中提供终止条件。
34
70.在for,while循环中使用增量计数。
34
71.使用StringTokenizer代替indexOf()和substring()。
34
72.不要在构建器中使用非final方法。
34
73.不要对参数进行赋值操作。
(5级)
35
74.不要通过名字比较两个对象的类,应该使用getClass()。
35
75.安全:
尽量不要使用内部类。
35
76.安全:
尽量不要使类可以克隆。
35
77.安全:
尽量不要使接口可以序列化。
35
78.安全:
尽量不要使用友好方法、属性和类。
35
79.Servlet:
不要使用方法。
35
80.Servlet:
不再使用HttpSession时,应该尽早使用invalidate()方法释放。
35
81.Servlet:
不再使用JDBC资源时,应该尽早使用close()方法释放。
35
82.Servlet:
不要使用Servlet的SingleThreadModel,会消耗大量资源。
35
83.国际化:
不要使用一个字符进行逻辑操作,使用Characater。
35
84.国际化:
不要进行字符串连接操作,使用MessageFormat。
35
85.国际化:
不要使用Date.toString(),Time.toString()方法。
35
86.国际化:
字符和字符串常量应该放在资源文件中。
35
87.国际化:
不要使用数字的toString()方法。
35
88.国际化:
不要使用StringBuffer,StringTokenizer类。
35
89.国际化:
不要使用String类的compareTo(),equals()方法。
35
90.复杂度:
建议的最大规模:
35
1参考文献
36
前言
本规范是参考公司的《软件编程规范总则》和SUN公司《JavaCodingStyleGuide》结合而成的Java语言编程规范。
本规范没有涉及到的相关部分,请参见《软件编程规范总则》。
本规范由OMC与网管研究管理部,智能业务研究管理部提出。
本规范主要起草和解释部门:
OMC与网管研究管理部,智能业务研究管理部
本规范主要起草人:
易雄志,张晋,李大伟,傅贵,童志刚,望岳
本规范主要审核人:
本规范批准人:
本规范规范所替代的历次修订情况和修订人为:
智能业务部对本规范的以下方面进行了补充和完善:
1、排版规范,2、注释规范,3、命名规范,4、编码规范,5、JTEST规范。
并且按照最新模版进行重新排版。
Java语言编程规范
1范围
本规范规定了使用Java语言编程时排版、注释、命名、编码和JTEST的规则和建议。
本规范适用于使用Java语言编程的部门和产品。
2规范性引用文件
下列文件中的条款通过本规范的引用而成为本规范的条款。
凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内容)或修订版均不适用于本规范,然而,鼓励根据本规范达成协议的各方研究是否可使用这些文件的最新版本。
凡是不注日期的引用文件,其最新版本适用于本规范。
序号
编号
名称
1
公司-0000
《软件编程规范总则》同总则的部分使用*号
2
公司-DKBA200106-003
《Java语言编程规范》
1术语和定义
规则:
编程时强制必须遵守的原则。
建议:
编程时必须加以考虑的原则。
格式:
对此规范格式的说明。
说明:
对此规范或建议进行必要的解释。
示例:
对此规范或建议从正、反两个方面给出例子。
2排版规范
2.1规则
1.*程序块要采用缩进风格编写,缩进的空格数为4个。
说明:
对于由开发工具自动生成的代码可以有不一致。
2.*分界符(如大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。
在函数体的开始、类和接口的定义、以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。
示例:
如下例子不符合规范。
for(...){
...//programcode
}
if(...)
{
...//programcode
}
voidexample_fun(void)
{
...//programcode
}
应如下书写。
for(...)
{
...//programcode
}
if(...)
{
...//programcode
}
voidexample_fun(void)
{
...//programcode
}
3.*较长的语句、表达式或参数(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
示例:
if(filename!
=null
&&newFile(logPath+filename).length(){