安全管理体系ISO27001JAVA编码规范.docx
- 文档编号:16674133
- 上传时间:2023-07-16
- 格式:DOCX
- 页数:20
- 大小:28.81KB
安全管理体系ISO27001JAVA编码规范.docx
《安全管理体系ISO27001JAVA编码规范.docx》由会员分享,可在线阅读,更多相关《安全管理体系ISO27001JAVA编码规范.docx(20页珍藏版)》请在冰点文库上搜索。
安全管理体系ISO27001JAVA编码规范
Java编码规范
1介绍
1.1目的
本文旨在制定Java编码标准。
所有Java开发人员应遵循本文中规定的标准。
目的是使根据本文中的标准开发的代码更容易维护、更易于理解并使编码人员工作更加轻松,本文并不详细介绍所有可能的标准或组合,它旨在解决一些将简化所有程序人员工作的关键问题。
1.2范围
本文件适用于用JAVA来实现的软件产品在编码实现过程中应遵循的规范。
1.3参考文档
本规范是基于Sun网站提供的JavaCodeConvention撰写的:
2术语表
名称/缩写
英文全称
中文解释
标准
表示必须遵循的规则。
如果您的代码不能满足这些标准,那么您的代码将不能得到广泛应用。
建议
表示我们建议您遵循的首选策略,以便系统达到最佳的性能。
示例
我们在许多地方加入了代码示例,以便程序员更清楚的理解我们的规范。
3规范概述
本规范为实现过程中用JAVA来进行编码时应遵循的规范,主要内容包括:
命名规范、JAVA文件样式、JAVA注释约定、缩进排版、编程技巧及指南及通用J2EE编码规范。
在实现过程中的编码实现,代码走查活动中使用到此规范。
4规范详述
4.1命名规范
4.1.1文件(File)
Java程序使用下列文件后缀:
文件类别
文件后缀
Java源文件
.java
Java字节码文件
.class
在Java中,Java文件名与类名一致。
示例:
HelloWorld.java,HelloWorld.class
4.1.2包(Package)
规则:
包的名字应该都是由一个小写单词组成,对于全局包,将你的Internet域名反转并接上包名。
版本名:
包的版本名应以这一包主要开发用于的项目阶段开始。
示例:
第1阶段包版本:
1.*
第2阶段包版本:
2.*
版本名中,包版本应跟在项目阶段编号之后。
包的最后版本的版本名应在版本名尾包括“(FINAL)”。
示例:
packagejava.awt;
4.1.3组件(Component)
规则:
组件/部件(Component)使用完整的英文描述来说明组件的用途,末端应接上组件类型。
示例:
okButton,customerList,fileMenu
4.1.4类(Class)
规则:
1.所有类名都必须以大写字母开始,必须拼写出整个单词而且附加词的第一个字母必须为大写字母,而其他字母都小写的单词组成。
2.不要为类添加前缀来标识类(除非某类名已存在)。
3.包名保证不要使用类名。
特定类型的类后缀添加应适当。
示例:
对于每个业务对象来说(如Customer),可能有其它相关的对象:
-服务器上的Home对象-如CustomerHome
-访问相应服务器对象的客户stub的对象-如CustomerHomeStub
-客户机和服务器对象共享的接口-如CustomerHomeInterface
-客户窗口界面包含代表业务对象的视图-如CustomerDetailsView
-管理业务流程客户控制器-如CreateCustomerManager
4.1.5接口(Interface)
规则:
采用完整的英文描述符说明接口封装,所有单词的第一个字母大写。
习惯上,名字后面加上后缀able,ible或者er,但这不是必需的。
示例:
Contactable,Prompter
4.1.6方法(Methods)
规则:
方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。
示例:
run(),runFast(),getBackground();
4.1.7常量(Constants)
规则:
所有类常量名和ANSI常量的声明,应该全部大写,单词间用下划线隔开。
(尽量避免ANSI常量,容易引起错误)必须全部大写,必须全部拼写出整个单词并且必须使用下划线分开单词。
示例:
UPPER_CASE_WITH_UNDERSCORES_BETWEEN_WORDS
4.1.8变量(Variables)
规则:
1.除了变量名外,所有实例,包括类,类常量,均采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。
变量名不应以下划线或美元符号开头,尽管这在语法上是允许的。
2.变量名应简短且富于描述。
变量名的选用应该易于记忆,即,能够指出其用途。
尽量避免单个字符的变量名,除非是一次性的临时变量。
临时变量通常被取名为i,j,k,m和n,它们一般用于整型;c,d,e,它们一般用于字符型。
3.对于循环计数器,通常采用字母i,j,k或者counter都可以接受。
i,j,k,counter
示例:
charc,inti,floatmyWidth;
4.1.9数组(Array)
数组应该总是用下面的方式来命名,
示例:
:
objectType[]。
byte[]buffer;
4.2Java文件样式
4.2.1版权信息(BeginningComments)
所有的源文件都应该在开头以注释的形式列出版权信息,这里面包括了源文件的类名、版本信息、日期、代码的开发者和修改者以及版权声明。
示例:
/*
*Classname
*
*Versioninformation
*
*Date
*
*Copyrightnotice
*
*OriginatedbyXXXXon2006/09/05
*
*ModifiedbyXXXXon2006/09/10
*/
4.2.2包和引入语句(PackageandImportStatements)
在多数Java源文件中,第一个非注释行是包语句。
在它之后可以跟引入语句(Import),引入语句(import)中标准的包名要在本地的包名之前,而且按照字母顺序排列。
如果import行中包含了同一个包中的不同子目录,则应该用*来处理。
示例:
packagejava.awt;
importjava.awt.peer.CanvasPeer;
importimportjava.io.*;
importjava.util.Observable;
*这里java.io.*使用来代替InputStreamandOutputStream的。
4.2.3类和接口声明(ClassandInterfaceDeclarations)
1每个Java源文件都包含一个单一的公共类或接口。
若私有类和接口与一个公共类相关联,可以将它们和公共类放入同一个源文件。
公共类必须是这个文件中的第一个类或接口。
2类注释和定义:
类注释位于引入语句之后,一般用来对类进行解释,类定义应该在类注释之下,包含了在不同的行的extends和implements;
示例:
publicclassCounterSet
extendsObservable
implementsCloneable
3类的静态变量的顺序:
首先是类的公共变量,随后是保护变量,再后是包一级别的变量(没有访问修饰符,accessmodifier),最后是私有变量。
4类的示例变量顺序:
首先是公共级别的,随后是保护级别的,再后是包一级别的(没有访问修饰符),最后是私有级别的。
5方法:
方法应该按功能,而非作用域或访问权限,分组。
例如,一个私有的类方法可以置于两个公有的实例方法之间。
其目的是为了更便于阅读和理解代码。
4.2.4类的成员变量(ClassFields)
public的成员变量必须生成文档(JavaDoc)。
proceted、private和package定义的成员变量如果名字含义明确的话,可以没有注释。
示例:
/**
*Packetcounters
*/
protectedint[]packets;
4.2.5存取方法
建议:
存取方法只是简单的用来将类的变量赋值获取值的话,可以简单的写在一行上。
但是,其他方法与存取方法不要写在同一行上。
示例:
/**
*Getthecounters
*@returnanarraycontainingthestatisticaldata.Thisarrayhasbeen
*freshlyallocatedandcanbemodifiedbythecaller.
*/
publicint[]getPackets(){returncopyArray(packets,offset);}
publicint[]getBytes(){returncopyArray(bytes,offset);}
publicint[]getPackets(){returnpackets;}
publicvoidsetPackets(int[]packets){this.packets=packets;}
4.2.6构造函数
构造函数应该用递增的方式写(比如:
参数多的写在后面)。
访问类型("public","private"等)和任何"static","final"或"synchronized"应该在一行中,并且方法和参数另写一行,这样可以使方法和参数更易读。
示例:
publicCounterSet(intsize){this.size=size;}
4.2.7ToString方法
每个类都应该明确定义ToString方法。
4.3Java注释约定
4.3.1注释的基本介绍
Java程序有两类注释:
实现注释(implementationcomments)和文档注释(documentcomments)。
实现注释用以注释代码或者实现细节,用“/*...*/”和“//”界定。
文档注释(被称为"doccomments")从实现自由(implementation-free)的角度描述代码的规范。
它可以被那些手头没有源码的开发人员读懂,是Java独有的,并由/**...*/界定。
它还可以通过javadoc工具转换成HTML文档。
注释应被用来给出代码的总括,并提供代码自身没有提供的附加信息。
注释应该仅包含与阅读和理解程序有关的信息。
例如,相应的包如何被建立或位于哪个目录下之类的信息不应包括在注释中。
在注释里,对设计决策中重要的或者不是显而易见的地方进行说明是可以的,但应避免提供代码中己清晰表达出来的重复信息。
多余的注释很容易过时。
通常应避免那些代码更新就可能过时的注释。
4.3.2注释的基本格式规范
1注释不应写在用星号或其他字符画出来的大框里。
注释不应包括诸如制表符和回退符之类的特殊字符。
2程序可以有4种实现注释的风格:
块(block)、单行(single-line)、尾端(trailing)和行末(end-of-line)。
详细规范参见下表:
注释风格
风格说明
示例
块注释(BlockComments)
块注释通常用于提供对文件、方法、数据结构和算法的描述。
块注释被置于每个文件的开始处以及每个方法之前。
它们也可以被用于其他地方,比如方法内部。
在功能和方法内部的块注释应该和它们所描述的代码具有一样的缩进格式。
块注释之首应该有一个空行,用于把块注释和代码分割开来。
块注释可以以/*-开头,这样indent
(1)就可以将其识别为一个代码块的开始,而不会重排它。
1,/*
*Hereisablockcomment.
*/
2,/*-
*Hereisablockcommentwithsomeveryspecial
*formattingthatIwantindent
(1)toignore.
*
*one
*two
*three
*/
单行注释(Single-LineComments)
短注释可以显示在一行内,并与其后的代码具有一样的缩进层级。
如果一个注释不能在一行内写完,就该采用块注释(参见"块注释")。
单行注释之前应该有一个空行。
if(condition){
/*Handlethecondition.*/
...
}
尾端注释(TrailingComments)
极短的注释可以与它们所要描述的代码位于同一行,但是应该有足够的空白来分开代码和注释。
若有多个短注释出现于大段代码中,它们应该具有相同的缩进。
if(a==2){
returnTRUE;/*specialcase*/
}else{
returnisPrime(a);/*worksonlyforodda*/
}
文档注释(DocumentationComments)
文档注释描述Java的类、接口、构造器、方法以及字段(field)。
每个文档注释都会被置于注释定界符/**...*/之中,一个注释对应一个类、接口或成员。
若想了解更多有关文档注释和javadoc的详细资料,参见javadoc的主页:
/**
*TheExampleclassprovides...
*/
3若你想给出有关类、接口、变量或方法的信息,而这些信息又不适合写在文档中,则可使用实现块注释(见5.1.1)或紧跟在声明后面的单行注释(见5.1.2)。
例如,有关一个类实现的细节,应放入紧跟在类声明后面的实现块注释中,而不是放在文档注释中。
4文档注释不能放在一个方法或构造器的定义块中,因为Java会将位于文档注释之后的第一个声明与其相关联。
4.4缩进排版
4.4.1行长度(LineLength)
尽量避免一行的长度超过80个字符,因为很多终端和工具不能很好处理。
注意:
用于文档中的例子应该使用更短的行长,长度一般不超过70个字符。
4.4.2换行(WrappingLines)
当一个表达式无法容纳在一行内时,可以依据如下一般规则断开之:
-在一个逗号后面断开
-在一个操作符前面断开
-宁可选择较高级别(higher-level)的断开,而非较低级别(lower-level)的断开
-新的一行应该与上一行同一级别表达式的开头处对齐
-如果以上规则导致你的代码混乱或者使你的代码都堆挤在右边,那就代之以缩进8个空格。
示例:
1.方法调用的断开换行:
someMethod(longExpression1,longExpression2,longExpression3,
longExpression4,longExpression5);
var=someMethod1(longExpression1,
someMethod2(longExpression2,
longExpression3));
2.算数表达式的断开:
longName1=longName2*(longName3+longName4-longName5)
+4*longname6;//这是一个比较好的断行方式
longName1=longName2*(longName3+longName4
-longName5)+4*longname6;//应该尽量避免这样的断行
3.if语句的换行通常使用8个空格的规则,因为常规缩进(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();
}
4.上述提到的三种方法也可以用在三元表达式中
alpha=(aLongBooleanExpression)?
beta:
gamma;
alpha=(aLongBooleanExpression)?
beta
:
gamma;
alpha=(aLongBooleanExpression)
?
beta
:
gamma;
4.5编程技巧与指南
4.5.1提高性能
建议在写代码的时候,从头至尾都应该考虑性能问题。
这不是说时间都应该浪费在优化代码上,而是应该时刻提醒自己要注意代码的效率。
比如:
如果没有时间来实现一个高效的算法,那么应该在文档中记录下来,以便在以后有空的时候再来实现它。
下面将提供一些优化性能的方法,与标准相比,这只是对编程的优化建议。
I.校验:
a当校验布尔型值时,不要采用如下方式
if(booleanValue==true)or
if(booleanValue==false)
建议使用
if(booleanValue)or
if(!
booleanValue)//Forfalsecondition
b避免在if和while条件句中使用(“=”)(不要编码为:
if(x=0){})。
原因是x将一直为0,条件将一直为真。
II.向量(Vector):
当需要持续处理向量(Vector)中的元素时,使用以下代码以提高运行效率:
示例:
for(inti=0;i //dosomethingtovector.elementAt(i) } 或者 for(inti=vector.size()-1;i>=0;i--){//slightlymoreefficient //dosomethingtovector.elementAt(i) } 而不要用: Enumeratione=vector.elements(); while(e.hasMoreElements()){ //dosomethingtoe.nextElement() } III.方法与构造函数: a.对象的Getter方法(与原始对象相反)应使用lazyinitialization(只有当它们需要时才初始化)。 原始对象将自动设置为缺省值(boolean=false、int=0等)。 b.不必要的对象构造 不要在循环中构造和释放对象 c.使用StringBuffer对象 在处理String的时候要尽量使用StringBuffer类,StringBuffer类是构成String类的基础。 String类将StringBuffer类封装了起来,(以花费更多时间为代价)为开发人员提供了一个安全的接口。 当我们在构造字符串的时候,我们应该用StringBuffer来实现大部分的工作,当工作完成后将StringBuffer对象再转换为需要的String对象。 比如: 如果有一个字符串必须不断地在其后添加许多字符来完成构造,那么我们应该使用StringBuffer对象和她的append()方法。 如果我们用String对象代替StringBuffer对象的话,会花费许多不必要的创建和释放对象的CPU时间。 d.synchronized关键字 避免不必要的使用关键字: synchronized,应该在必要的时候再使用她,这是一个避免死锁的好方法。 IV.类常量: 如果可能,使用Constant类型的原始数据类型而不是它们的值本身。 这有助于提高代码的运行效率,减少内存需求,因为很少有对象将需要初始化。 示例: 应该用publicstaticfinalintBY_ORG_NAME=1; 而不是 publicstaticfinalIntegerBY_ORG_NAME=newInteger (1) 4.5.2增强代码可读性 1变量赋值 避免在一个语句中给多个变量赋相同的值,增强可读性。 例如: fooBar.fChar=barFoo.lchar='c';//AVOID! 不要将赋值运算符用在容易与相等关系运算符混淆的地方。 例如: if(c++=d++){//AVOID! (Javadisallows) ... } 应该写成 if((c++=d++)! =0){ ... } 不要使用内嵌(embedded)赋值运算符试图提高运行时的效率,这是编译器的工作。 例如: d=(a=b+c)+r;//AVOID! 应该写成 a=b+c; d=a+r; 2运算符表达式: 一般而言,在含有多种运算符的表达式中使用圆括号来避免运算符优先级问题,是个好方法。 即使运算符的优先级对你而言可能很清楚,但对其他人未必如此。 你不能假设别的程序员和你一样清楚运算符的优先级。 示例: if(a==b&&c==d)//尽量避免 if((a==b)&&(c==d))//正确 4.5.3减少编码错误 ∙exit() exit除了在main中可以被调用外,其他的地方不应该调用。 因为这样做不给任何代码机会来截获退出。 一个类似后台服务的程序不应该因为某一个库模块决定了要退出就退出。 ∙异常 申明的错误应该抛出一个RuntimeException或者派生的异常。 顶层的main()函数应该截获所有的异常,并且打印(或者记录在日志中)在屏幕上。 ∙垃圾收集 JAVA使用成熟的后台垃圾收集技术来代替引用技术。 但是这样会导致一个问题: 你必须在使用完对象的实例以后进行清场工作。 除非输出流一出作用域就关闭,非引用计数的程序语言,比如JAVA,是不能自动完成变量的清场工作的。 示例: FileOutputStreamfos=newFileOutputStream(projectFile); project.save(fos,"IDEProjectFile"); fos.close(); ∙Clone 示例: implementsCloneable public Objectclone() { try{ ThisClassobj=(ThisClass)super.clone(); obj.field1=(int[])field1.clo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 安全管理 体系 ISO27001JAVA 编码 规范