JAVA代码编写规范.doc
方正春元科技发展有限公司Java代码编写规范文档编号:FOUNDERCY-MD-SPECIFICATION-31-1.0编写:吴显富日期:2003-5-27审批:曾纪才日期:2003-5-29受控状态:是【 】 否【 】发布日期:2003-5-29文件修改记录表修改内容要点修改时间修改人审批人目 录1.引言11.1编写目的11.2适用范围11.3引用标准11.4参考资料12.基本概念22.1规范的重要性22.2模块开发卷宗22.2.1源程序文件与模块32.2.1.1源程序文件32.2.1.2模块32.2.1.3源程序文件与模块的关系32.2.2模块开发卷宗的组成42.2.2.1基本要求42.2.2.2Java的注释类型在本规范中的映射42.2.2.3Javadoc及其文档标记53.JAVA注释规范73.1一般原则73.2源程序文件头注释73.2.1编写过程73.2.2内容73.2.2.1强制性条目73.2.2.2可缺省条目83.2.3形式审查83.3模块(类)注释93.3.1编写过程93.3.2内容93.3.2.1强制性条目93.3.2.2可缺省条目93.3.3形式审查103.4段注释113.4.1编写过程113.4.2内容与示例113.4.2.1属性注释113.4.2.2方法注释123.4.2.3异常注释133.5行尾注释133.5.1编写过程133.5.2内容134.JAVA命名规范144.1一般原则144.2接口、类、编译单元、包的命名144.2.1接口命名144.2.2类命名154.2.3包命名154.2.4编译单元命名154.3属性命名164.3.1一般约定164.3.2组件的命名164.3.3常量的命名164.3.4集合的命名174.4方法命名174.4.1一般约定174.4.2存取方法命名(accessors)174.4.2.1获取方法(getters)184.4.2.2设置方法(setters)184.4.2.3构造方法184.5方法参数命名194.6局部变量命名194.6.1流的命名194.6.2循环计数器的命名194.6.3异常对象的命名205.JAVA编码规范205.1类的编码规范205.1.1类的可见性205.1.2对属性和方法进行排序205.2属性的编码规范215.2.1属性的可见性215.2.2对属性的访问215.3方法的编码规范215.4局部变量的编码规范225.5用于测试的编码规范226.JAVA编码优化237.JSP规范257.1jsp文件存放257.2jsp文件名257.3jsp目录名称与结构257.4jsp其他规范26附录一:名词与术语解释26附录二:JAVADOC的使用28 1. 引言1.1 编写目的本文档是关于Java编程的规范性文件。主要内容是规范Java编程过程中代码编写、注释编写、模块开发卷宗生成等工作。目前版本是Ver1.0。Java是基于Internet的跨平台的编程语言,与传统的编程语言(C/C+、Basic等)相比有不少独特性的内容和要求,因此本规范初步设计将经过征求意见、试用、定稿等阶段,最后批准执行。定稿以后的规范也将在适当时间进行版本升级和内容更新。1.2 适用范围JAVA编码人员和相关部门技术管理人员和品质保证部。1.3 引用标准1中华人民共和国标准:软件工程术语,GB/T11457-1995.2中华人民共和国标准:信息技术 软件生存期过程,GB/T8566-19953中华人民共和国标准:计算机软件产品开发文件编制指南,GB/T8567-19881.4 参考资料1 Java代码编写规范.2可用javadoc直接生成的Java程序注释写法规范3如何写出稳健的Java代码,曹淼译,2000.9.30.(原文:Writing Robust Java Code,Scott W.Ambler,2000.1.15.)4Java编程思想(Thinking in JAVA),京京工作室译(原著:Bruce Eckel),机械工业出版社,2000.4.2. 基本概念2.1 规范的重要性用于Java的编码规范之所以重要是因为它们可以使开发团队的代码中产生较好一致性。好的一致性可产生较容易理解的代码,它也意味着代码容易开发和维护。 这将减少开发工作的全部成本。模块开发卷宗是软件文档与程序的结合,是由软件设计通往软件实现的桥梁;同时具有文档类产品与程序类产品的双重属性:模块开发卷宗是程序,是带有规范化注释的源程序,能直接生成可运行的程序代码。模块开发卷宗又是软件设计的延伸,是一卷可印刷、可阅读的文档,是最详细的设计说明,是自顶向下(Top-Down)软件设计描述(概要设计说明书详细说明书模块设计说明书)的终点。综上所述,无论从编写规范的Java代码的角度,还是从按软件工程生成模块开发卷宗的角度来看,本规范是绝对需要的。2.2 模块开发卷宗提起软件开发似乎就是编程序、写代码,模块开发卷宗好像是个新概念。实际上,模块开发卷宗(Module Development Folder)是80-90年代普遍采用的一类软件中间产品形式,在传统的软件工程管理中起重要作用;至今仍在使用。本规范中,模块开发卷宗主要包括两部分:具备完整注释的源程序文件、由Javadoc生成的HTML文件。在软件配置计划中,将具备完整注释的源程序列为程序类软件中间产品;将Javadoc生成的HTML文件列为文档类中间产品。另外,为了开发小组之间的交流和工作同步,还需要按照代码说明规范完成一定的说明文档。此说明文档与模块开发卷宗有一定的重叠,但是必须的。说明文档也列为文档类中间产品。程序(模块)编码实现时的一个原则是:先写注释,后编码。目前情况,代码中的注释按照本规范手工输入;然后使用工具Javadoc生成HTML文件。2.2.1 源程序文件与模块针对Java语言的具体情况,这里对“源程序文件”和“模块”(即软件模块)这两个术语加以特别说明:2.2.1.1 源程序文件在基于Java语言的软件工程中,一个源程序文件就是一卷模块开发卷宗。在软件配置管理系统中,源程序文件是用于配置管理的程序单元,是列入软件配置计划的程序类软件配置项SCI。2.2.1.2 模块软件模块简称模块(module),在国家规范1中,模块一词有两种解释:a、是离散的程序单位。且对于编译、对于和其他单位相结合,对于装入来说是可识别的,例如,汇编程序、编译程序、连接编辑程序或执行的例行程序的输入或输出。b、程序中一个能逻辑地分开的部分。在本规范中选用上述第二种解释。一般的说,一个模块实现一定的功能,或提供一定的服务,或一组数据。具体到Java语言的程序设计中,模块是一组用户定义类(Class)的声明。2.2.1.3 源程序文件与模块的关系在Java语言中,原则上一个源程序文件包含一个软件模块(Class)。软件工程中软件的配置管理只管到源程序文件级,而不深入到文件内部去管理模块。与此相反,在设计文档种,却必须包括对模块的描述。由此可见,“程序类软件产品”包容“源程序文件”;“源程序文件”包容“模块”。2.2.2 模块开发卷宗的组成2.2.2.1 基本要求本规范中要求在源程序文件中编写下面四种注释语句,即可满足模块开发卷宗的要求:(1)源程序文件头注释(Source file header),又称源程序文件前言(Preface)。模块开发卷宗以源程序文件为单位;每一个源程序文件必须有一份头注释,放在源程序文件的开头,对整个源程序文件加以说明。(2)模块注释(Module comment),在Java语言中可以成为类注释。模块注释是模块开发卷宗的核心。每一个模块都必须编写模块注释。模块注释放在该模块的前面。(3)段注释(Segment comment),又称块注释(Block comment),是插在模块内部的一些说明。在Java语言中,主要使用段注释对类的属性(又称域、成员变量、字段,field)和方法(又称成员函数,method)进行注释。本规范要求必须编写段注释,放在该段的前面。(4)行尾注释(End-of-line comment),简称行注释(Line comment),是对该行程序的简短解释;必要时才编写,放在程序行的后面。在模块开发卷宗中,四种注释的重点是不同的: 源程序文件头注释主要面向配置管理 模块注释对模块做全面说明,特别强调描述模块结构 段注释着眼于详细描述代码运行过程 行注释辅助解释个别代码点本规范中,源程序头注释、模块注释和段注释是强制的,即不可缺省的。而且,对强制性注释还规定了强制性条目。其他注释内容则是可缺省的。2.2.2.2 Java的注释类型在本规范中的映射Java有三种注释类型:文档类型、C类型和单行注释。文档类型:以 /* 开始,而以 */ 结束,可以由Javadoc自动处理。例如:/*Customer A customer is anyperson or organization that wesell services and products to.author S.W. Ambler*/C类型:以 /* 开始,而以 */ 结束。例如:/*This code was commented outby J.T. Kirk on Dec 9, 1997because it was replaced by thepreceding code. Delete it after twoyears if it is still not applicable. . . (the source code )*/单行注释:以 / 开始,直到源代码行的结束。例如:/ Apply a 5% discount to all invoices/ over $1000 as defined by the Sarek/ generosity campaign started in/ Feb. of 1995.在本规范中,头注释、模块注释和段注释使用文档类型编写,并且使用一定的Javadoc文档标记(Doc tags)。行尾注释的编写原则不限制使用何种类型,一般使用单行注释。2.2.2.3 Javadoc及其文档标记在SUN的Java开发工具包(JDK)中含有一个称为javadoc的程序,它处理Java源程序文件,并且以HTML的形式产生一个外部文档,类似联机帮助文档。javadoc主要通过两种方式生成HTML文档:嵌入的HTML,或使用“文档标记”。其中,“文档标记”(Doc tags)是一些以“”开头的命令,置于注释行的起始处(但前导的“*”会被忽略)。所有javadoc文档标记只能出现于Java文档类型注释中。实际上文档标记总是和HTML标记混合使用的,在本规范中就是混合使用的。主要是使用HTML标记“<p>”,实现注释文字的换行。具体使用样例参看下文。本文档中使用“文档标记”对源程序进行相应注释。javadoc只能为public(公共)和protected(受保护)成员处理注释文档。“private”(私有)成员的注释一般会被忽略,我们看不到任何输出。Javadoc目前版本使用的“文档标记”见表1。“文档标记”的具体使用见本规范的第三部分。表1、javadoc“文档标记”一览表文档标记功能author 作者信息“作者信息”包括作者的姓名、电子函件地址或者其他任何适宜的资料。可为一系列作者使用多个这样的标记,但它们必须连续放置。deprecated该标记用于指出一些旧功能已由改进过的新功能取代。该标记的作用是建议用户不必再使用一种特定的功能,因为未来改版时可能摒弃这一功能。若将一个方法标记为deprecated,则使用该方法时会收到编译器的警告。exception完整类名 说明“异常”注释。简言之,它们是一些特殊的对象,若某个方法失败,就可将它们“扔出”对象。“完整类名”明确指定了一个异常类的名字,它是在其他某个地方定义好的。而“说明”(同样可以延续到下面的行)告诉我们为什么这种特殊类型的异常会在方法调用中出现。param参数名 说明“参数名”是指参数列表内的标识符,而“说明”代表一些可延续到后续行内的说明文字。一旦遇到一个新文档标记,就认为前一个说明结束。可使用任意数量的说明,每个参数一个。return说明“说明”是指返回值的含义。它可延续到后面的行内。since此标记表示自从什么版本开始有效see 类名在生成的文档里自动加入一个超链接的“See Also”(参见)条目。注意javadoc不会检查我们指定的超链接,不会验证它们是否有效。see 类名#方法名同上。version 版本信息“版本信息”代表任何适合作为版本说明的资料。3. Java注释规范3.1 一般原则l 注释是为了使代码更清楚l 如果源程序不值得写文档(注释),它就不值得运行。l 避免空洞的注释l 注释要简单l 先写注释后编程l 即要注释“做什么”,也要注释“为什么这样所”3.2 源程序文件头注释3.2.1 编写过程源程序文件头注释描述整个文件,而且描述是逐次完成的。源程序文件作为软件系统的程序配置项,一般在编写系统配置计划时予以定义,并赋予唯一的配置项代号。因而,文件头注释的前几行(名称,配置项代号等),可有软件配置计划直接导出,并作为编写该程序文件的进入条件。源程序文件作者补齐头注释的内容(例如,源程序文件的版本号),形成完整的头注释。在源程序文件提交之前再对头注释做最后敲定。3.2.2 内容3.2.2.1 强制性条目源程序文件头注释是面向配置管理的,通常不是面向软件详细设计的。在Java语言编程实践中,一般是一个源程序文件对应一个类(模块);从这个意义上说,Java源程序文件头注释与软件详细设计也具有一定的关系。针对javadoc的处理原则,完整的源程序文件头注释至少包括2个条目: 源程序文件名称(标题) 软件配置项代号(在软件工程尚不完善时,此项暂空缺)3.2.2.2 可缺省条目除上述强制性条目外,视具体情况可适当增加其他注释内容。例如: 源程序文件摘要,说明该程序的用途等 环境要求:操作系统,编译器,Debugger,库,等等 与老版本的差别:这里只说明被修改的程序行位置,具体修改内容由后续的注释描述 其他需要说明的事项,例如文件背景,与其他源程序文件的参考关系3.2.3 形式审查(1)配置管理员(CM)阅读源程序文件头注释,进行该配置项与相关配置项的形式匹配(源程序级)。(2)质量保证人员(QA)对源程序文件头注释进行形式审查。首先检查强制性条目是否有遗漏,然后检查内容是否正确。(3)Java源程序文件头注释强制性条目示例如下(注意和<p>的混合使用):/* * (#)GeoMap.java <源程序文件名称> *<p>SCI: NULL <软件配置项代号>(4)注释即可以使用英文也可以使用中文,为了阅读的方便,本规范混合使用两种语言,如上所示。其他注释的语言使用参照执行。3.3 模块(类)注释3.3.1 编写过程软件系统由若干模块(类)组成。各模块(类)已由软件详细设计说明书定义,并赋予唯一的标示符。因而,模块(类)注释的前几行已经由软件设计师草拟。所以模块(类)注释的前几行可从软件详细设计说明书中导出。完整的模块(类)注释由程序员编写,在源程序文件作为软件配置项提交前,对模块(类)注释内容作最后敲定。针对javadoc的处理原则,本规范中对模块(类)注释做强调要求,注释详细,注释项多。3.3.2 内容3.3.2.1 强制性条目模块开发卷宗是软件设计的终点,应该与软件详细设计说明书有适当的重复。以下条目是模块(类)注释的强制性条目,。 类名称 公司的软件版权声明(英文、中文) 类功能:类完成的处理或功能 源程序文件提交日期 源程序文件版本历史 版本号 源程序文件作者或维护者 使用的JDK版本3.3.2.2 可缺省条目除上述强制性条目外,视具体情况可适当增加其他注释内容。例如: 同步策略:任何实现接口Runnable的类应该具有完整描述的同步策略。包括以下几点:Synchronized objects、balking objects、guarded objects、versioned objects、concurrency policy controllers、 以及acceptors。 参考条目 测试信息 限制:模块可用范围或边界 已知的副作用(Side effect):对其他类或数据的潜在影响3.3.3 形式审查QA对模块开发卷宗的模块注释进行形式审查,一方面阅读源程序检查强制性条目是否有遗漏,一方面阅读javadoc生成的HTML文档进行相关检查(内容是否完整、链接是否正确等)。Java类注释强制性条目示例如下(注意和<p>的混合使用):/* * 动态创建查询结果显示面板类 * <p>Copyright 2000 by Digiark Software corporation, * <p>All rights reserved. * <p>版权所有:方正春元科技发展有限公司 * <p>未经本公司许可,不得以任何方式复制或使用本程序任何部分, * <p>侵权者将受到法律追究。 * <p>DERIVED FROM: NONE * <p>PURPOSE:WebGIS界面上,动态创建查询结果显示面板,响应区域查询操作 * <p>DESCRIPTION: 面板上共有七个组件:Label(4)、Choice、List、Button* <p>CALLED BY: ArkGis * <p>UPDATE: Sun Hongjun(孙洪君) * <p>DATE: 2000年10月30日 * <p>HISTORY: 1.0 * version 1.0 * author Sun Hongjun(孙洪君) * since java 1.3.0-C * see ArkGis * see MapArea */public class AreaQueryResultDisPanel extends Panel3.4 段注释3.4.1 编写过程Java源程序文件以类为单位进行组织,所以“段”的概念有一些转化,属性(属性)声明、方法声明、特殊“异常”声明以及方法内的完整语义段都可以作为“段”。段注释都写在该段程序行的前面,占用一行或若干行。段注释由程序员编写。本规范要求,程序员应先规划好类的相应“段”,写出各段注释,然后再编程。在编程过程中,只要必要,随时插入段注释,对程序要点进一步说明。在源程序文件提交之前再对各段注释作最后检查。3.4.2 内容与示例3.4.2.1 属性注释对于一些意义很明显的属性不用注释写法示例: /*图名*/ protected String mapName; /*所用图符,不序列化,接收GeoMap后应从pixels生成 */ protected transient Image icons; /*保存图符的原始数据*/ protected byte pixels;3.4.2.2 方法注释方法注释说明方法的要点(逻辑、算法或数据含义,等),是程序作者或读者在阅读这段程序时,不必在自己的头脑中仿真运行代码的执行过程。本规范给出方法注释的几个内容选项,程序员可以视情况选用: 方法功能说明(必需) 方法实现逻辑(可选) 方法参数(可选) 方法返回值(可选) 方法涉及的数据(可选) 方法的修改维护历史说明:何时修改、修改人员等(可选) 方法的缺陷(bugs)(可选) 方法的所有异常(可选) 方法可见性设置的原因(可选) 一个方法如何改变一个对象(可选) 激活方法的例子(可选) 应用前提和后置条件(可选) 并发性说明(可选)写法示例: /*地图对象构造函数* * param mapName 图名 */ public GeoMap(String mapName) this.mapName = new String(mapName); roundRect = new GeoTRect(); viewRect = new GeoTRect(); layerList = new Vector(); /*取图名称* * return 图名 */ public String getName() return mapName; 3.4.2.3 异常注释写法示例:/* * exception IOException 若有错误输入或输出便抛出IO异常 */ public void f() throws IOException / body 3.5 行尾注释3.5.1 编写过程源程序文件由若干程序行组成;每一行可能有完整的语义,也可能没有完整的语义。行尾注释由程序员在编程或维护时随时插入的。所以行尾注释通常是“先编程,后注释”。行尾注释不单独占用一行,而是附在同一行的后面。如果行尾注释长度超出一行,最好不要写在续行上,而应该为段注释,移到这行的前面。3.5.2 内容行尾注释是对程序中的“一点”进行说明,以便进一步改善程序的可读性,有利于代码的走查(Walk-through),有利于程序的理解与软件维护。行尾注释具有非常大的任意性。提倡程序员在程序行后附加足够的注释,但并非越多越好。行尾注释必须能对程序的理解增加新的信息。对于那些已清楚地自说明的行,附加注释是没有意义的。例如,下列情形均由必要插入行尾注释: 对语句地用途进行附加说明(例如:/调用XX方法) 多线程通信中地加锁(Lock)和解琐(Unlock) 在多层嵌套判断结构中,一层的结束行(例如:/XX循环结束) 模块(类)结束行(例如:/XX模块(类)结束) 源程序文件结束行(例如:/XX文件结束)4. Java命名规范4.1 一般原则l 使用完整的英语描述l 使用符合专业领域术语l 使用混合大小写增强可读性l 在保证可读性的情况下,使用简写方式l 避免长名字(最好在15字符以内)l 避免出现仅仅是大小写不同的两个变量名字4.2 接口、类、编译单元、包的命名4.2.1 接口命名接口(使用“interface”关键字)可以认为是一个“纯”抽象类。它允许创建者规定一个类的基本形式:方法名、自变量列表以及返回类型,但不规定方法主体。接口也包含了基本数据类型的数据成员,但它们都默认为static和final。接口只提供一种形式,并不提供实施的细节。接口这样描述自己:“对于实现我的所有类,看起来都应该象我现在这个样子”。接口的命名,每个单词的首字母为大写,且命名英文混合大小写。本规范规定接口命名利用一个可描述的形容词,如Runnable 或 Cloneable,等。4.2.2 类命名类的命名,每个单词的首字母为大写,且命名英文混合大小写。例如:CustomerEmployeeOrderOrderItemFileStreamString4.2.3 包命名包是一个相关类的集合。有几个涉及包命名的规则如下所示:(1)包名称以英文句号分割标示符,标示符全部为英文小写。SUN公司建议包中的标示符由英文句号来分割。例如:java.awt。(2)来自SUN公司的标准的java分布包是以标示符java和javax开始的。(3)局部包的名称以一个并非全部为大写的标示符开始。局部包是用于你的部门内部的,并且将不被分发给其它部门。例如:persistence.mapping.relational 和interface.screen.(4)将要分发给多个部门的一个包(全局包),名称中应该包括源部门的域名,顶级域名小写。例如:com.ambysoft.www.persistence.mapping.relational和com.ambysoft.www.interface.screens。(5)包的命名应该是单数。常用的规范是利用单一的名称对包进行命名。如:interface.screen,而不是复数,如:interface.screens。4.2.4 编译单元命名一个编译单元就是一个源程序文件,但是这个源程序文件包含两个或者两个以上的类或接口。本规范建议,尽量不使用编译单元!使用编译单元中所定义的接口或类的名称对编译单元命名,且大小写相同。例如:Customer.javaSingleton.javaSavingsAccount.java4.3 属性命名4.3.1 一般约定本规范中属性使用全英文进行命名,一般情况是所有单词都小写,单词之间以下划线(_)分开。例如:first_namezip_codeunit_pricediscount_rateorder_itemssql_database4.3.2 组件的命名对于图形化用户界面,组件(按钮、菜单等)是必不可少的。本规范中,组件以“组件功能+组件类型”的方式进行命名。例如:okButtoncustomerListfileMenunewFileMenuItem4.3.3 常量的命名在Java中,常量的值不发生变化,是典型的类的静态终止(static或final)属性。常量的命名标准是使用全部大写的英文单词,单词之间使用下划线连接。例如:MINIMUM_BALANCEMAX_VALUEDEFAULT_START_DATE4.3.4 集合的命名集合,如序列或矢量,以集合类型的第一个字母开始,加上类名的复数形式进行命名。例如:List lCustomers=null;Vector vOrderItems=null;4.4 方法命名4.4.1 一般约定方法使用全英文描述来命名,并且,方法命名字符串中第一个词全部小写,以后其他各词首字符大写。另外,一个通常的规则是一个方法名的第一个词应该是动词。例如:openAccount()printMailingLabel()save()delete()4.4.2 存取方法命名(accessors)存取方法用来获取和设置类属性值。存取方法的命名规则概括如下:4.4.2.1 获取方法(getters)获取方法返回类的一个属性值。一般存在两种情况:属性为二态变量,属性非二态变量。如果属性为二态变量,则获取方法的前缀是“is”;如果属性非二态变量,则获取函数的前缀是“get”。例如:getFirst_name()getAccount_number()getLost_eh()isPersistent()isAt_end()4.4.2.2 设置方法(setters)设置方法也称为修改方法,它修改类的一个属性值。设置方法的前缀是“set”, 无论属性的类型是什么。例如:setFirst_name( String aName)setAccount_number( int anAccountNumber)setReasonable_goals( Vector newGoals)setPersistent( boolean isPersistent)setAt_end( boolean isAtEnd)4.4.2.3 构造方法当一个对象(类)首先被创立时,构造方法完成任何必要的初始化。构造方法总是与给定它们的类名相同,且大小写相同。例如:Customer()SavingsAccount()PersistenceBroker()这个命名规则由SUN公司制订,并且必须严格遵守。4.5 方法参数命名使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字: SetCounter(int size) this.size = size; 4.6 局部变量命名局部变量是在一个代码块范围内(如方法)定义的对象或数据条目。一个局部变量的范围就是它所定义的数据块范围。在本规范中,局部变量原则上以与属性相同的规范进行命名的,即使用全英文进行命名,且首单词全部小写。在编程实践中,有几个特定的局部变量类型,其命名约定比较特殊,下面分别作以介绍。4.6.1 流的命名当有一个单个的输入流或输出流在一个方法内被打开,被利用,然后被关闭时,利用“in”和“out”对这些流命名。对于一个用于输入和输出两者的流来说, 它的名称就是inOut。例如:inStreamoutStreaminOut4.6.2 循环计数器的命名在本规范中,循环计数器通常以单个字母i、j或者k进行命名。如果i、j、k不够使用时,可考虑适当扩展,如:ii、jj、kk等。4.6.3 异常对象的命名异常处理在Java编码中是非常普通的问题,本规范中,对异常对象以单个字母“e”进行命名。5. Java编码规范5.1 类的编码规范5.1.1 类的可见性面向对象程序设计的基本特征之一就是使类的公共接口最小化。换句话说,这是关于类的可见性的问题。Java中类的可见性定义有:public、package(缺省,意为友好访问)以及特别的final。public类型的类对所有的其它的类都是可见的;而package的却省类仅对同一包内的类是可见的;使用final定义的类是不能被继承的。本规范建议在进行Java编程时必须认真考虑使类的公共接口最小化。5.1.2 对属性和方法进行排序本规范要求以一种统一的方式对类的属性和方法进行声明,但具体方式不作强制规定。这里给出本规范的一个建议:在类中以最容易访问到最不容易访问的顺序对属性和方法进行声明。例如:private fieldsconstructorsfinalize()public member functionsprotected member functionsprivate member functions5.2 属性的编码规范5.2.1 属性的可见性本规范对属性的可见性有三个要求:(1)所有的属性都以private进行声明;(2)对于不一致的属性(它们将不会被永久的存储),把它们定义为静态的(static)或暂时的。(3)不要“隐藏”属性名称。5.2.2 对属性的访问本规范中规定在编程实践中对属性的访问只有一个途径,就是通过存取方法实现。这样做的目的是使类的封装性更好。举例如表2。表2、属性及存取函数举例属性类型获取函数设置函数first_nameStringgetFirst_ame()setFirst_name()addressSurfaceAddress objectgetAddress()setAddress()persistentBooleansetPersistent()setPersistent()customer_numberIntgetCustomer_number()setCustomer_number()order_itemsArray of OrderItem objectgetOrder_items()setOrder_items()关于Java中存取函数的高级技术可以参考参考文献3,本规范不作强制性规定。5.3 方法的编码规范一个好的设计应该使类之间的关联最小,这也是本规范的要求。当设计一个方法的可见性时,本规范要求尽可能地先限制它。如果一个方法不必是公有的(public),那么使它设置为保护的(protected),而如果不必被保护,那么就设置它为私有的(private)。表3是详细的分类解释。表3、关于方法可见性定义的分类解释可见性描述相应的用法public一个公有方法能够被任何其它对象或类的任何方法激活。当一个方法必须对继承类中的外部对象或外部类可访问时,定义该方法为public。protected一个保护方法能够被类中的其它任何方法以及其子类中的方法激活。当方法只提供给继承类中方法访问时,定义该方法为protected。private私有方法仅能被本类中的其它方法所激活。私有方法为类提供特定的行为,通常对类的内部进行重新整合。私有方法的作用范围只限于类内部。(包内缺省的友员方法)表示没有任何可见性。这被称为缺省或包可见性,并且有时被称为友好的可见性。方法在同一个包内对所有其它类都是有效公有的,但对包的外部的类是私有的。当要建造域组件(Domain components)时应用该特征,如实现一个“Customer”的商务概念集合,仅供组件或包中的类进行限制访问。5.4 局部变量的编码规范关于局部变量的编码规范本规范有以下几点要求:(1)不要“隐藏”局部变量;(2)每行代码声明一个局部变量;(3)在局部变量证明的同一行内对它进行注释;(4)在使用局部变量的语句前面声明该局部变量,即声明局部变量之后马上使用它;(5)一个局部变量只做一个用途。5.5 用于测试的编码规范测试是软件开发过程中