《2022年Java开发规范使用手册 .pdf》由会员分享,可在线阅读,更多相关《2022年Java开发规范使用手册 .pdf(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第 1 页 共 34 页Java 开发规范使用手册名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 34 页 -第 2 页 共 34 页目录第 1 章绪论.4 1.1 编制依据.4 1.2 目的和意义.4 1.3 范围.4 1.4 版权声明.4 1.5 参考资料.4 1.6 概述.5 第 2 章代码组织与风格.5 2.1 基本原则.5 2.2 缩进.5 2.3 长度.6 2.4 行宽.6 2.5 间隔.6 2.6 对齐.6 2.7 括号.7 第 3 章注释.7 3.1 基本原则.7 3.2 JavaDoc.8 3.3 文件与包注释.8 3.4 类、接口注释.8 3.5 方法注释.9
2、 3.6 其他注释.10 3.7 注释参考表.10 第 4 章命名.11 4.1 基本原则.11 4.2 文件、包.11 4.3 类、接口.12 4.4 字段.12 常量.12 变量和参数.12 组件/部件.12 集合.12 神秘的数.12 其他.13 4.5 方法.13 异常.13 4.6 命名约定表.13 第 5 章声明.15 5.1 基本原则.15 5.2 包.15 5.3 类、接口.16 名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 34 页 -第 3 页 共 34 页5.4 方法.16 5.5 字段.16 5.6 示例.17 第 6 章类与接口.18 6.1 基本原则
3、.18 6.2 抽象类与接口.18 6.3 继承与组合.18 6.4 构造函数和静态工厂方法.19 6.5 toString(),equals(),hashCode().19 6.6 Singleton Class.20 第 7 章方法.21 7.1 基本原则.21 7.2 参数和返回值.21 第 8 章表达式与语句.22 8.1 基本原则.22 8.2 控制语句.22 8.3 循环语句.23 第 9 章错误与异常.24 9.1 基本原则.24 9.2 已检查异常与运行时异常.24 9.3 异常的捕捉与处理.24 第 10 章测试与 Bug 跟踪.25 10.1 基本原则.25 10.2 测试
4、驱动开发.25 10.3 Junit 单元测试.25 10.4 自动测试与持续集成.25 10.5 Bug 跟踪和缺陷处理.26 第 11 章性能与安全.26 11.1 基本原则.26 11.2 String 与 StringBugffer.26 11.3 集合.26 11.4 对象.27 11.5 同步.27 11.6 final.27 11.7 垃圾收集和资源释放.27 第 12 章其他.28 12.1 目录结构.28 12.2 CVS 注释与标记.29 第 13 章附录.29 13.1 CVS 标识符.29 13.2 注释模板.29 13.3 常用缩写简表.30 13.4 版权声明模板.
5、30 13.5 示例代码.32 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 34 页 -第 4 页 共 34 页第1章绪论1.1 编制依据Java 开发规程1.2 目的和意义本规范的目的是使本组织能以标准的、规范的方式设计和编码。通过建立编码规范,以使每个开发人员养成良好的编码风格和习惯;并以此形成开发小组编码约定,提高程序的可靠性、可读性、可修改性、可维护性和一致性等,增进团队间的交流,并保证软件产品的质量。通过制定本规范,可以统一应用系统各软件的设计和开发,为下一步应用系统集成做好准备。各应用软件开发商通过遵循本规范,可以简化应用软件的开发,更好与其它软件协作,完成相关业
6、务功能。1.3 范围本规范适用于“catv Framework”及其下所有软件项目、产品等的设计、开发以及维护、升级等。本规范使用于“catv Framework”的所有软件开发人员,在整个软件开发过程中必须遵循此规范。1.4 版权声明本文档为玩家网的内部开发规范,不得转载。未经catv 授权,任何个人、组织或单位不得将本文档用于书面发表、转载、摘录等,亦不得用于其他商业行为。1.5 参考资料Java 编程指南见RUP(Rational Unified Process)中文版。Java 技术手册(Java in a Nutshell)Sun Java 语言编码规范(Java Code Conv
7、entions)Effictive Java Java PitfallsJava RulesJava 互联网流行开发规范名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 34 页 -第 5 页 共 34 页1.6 概述对于代码,首要要求是它必须正确,能够按照设计预定功能去运行;第二是要求代码必须清晰易懂,使自己和其他的程序员能够很容易地理解代码所执行的功能等。然而,在实际开发中,每个程序员所写的代码却经常自成一套,很少统一,导致理解困难,影响团队的开发效率及系统的质量等。因此,一份完整并被严格执行的开发规范是非常必须的,特别是对软件公司的开发团队而言。此规范参考自业界标准编程规范并
8、结合多位编程高人多年编程经验、习惯等而制定。最根本的原则:代码虽然是给机器运行的,但却是给人读的!运用常识。当找不到任何规则或指导方针,当规则明显不能适用,当所有的方法都失效的时侯:运用常识并核实这些基本原则。这条规则比其它所有规则都重要。常识是必不可少。当出现该情况时,应当及时收集并提交,以便对本规范进行修改。第2章 代码组织与风格2.1 基本原则代码的组织和风格的基本原则是:便于自己的开发,易于与他人的交流。因个人习惯和编辑器等可以设置和形成自己的风格,但必须前后一致,并符合本规范的基本要求和原则。本章所涉及到的内容一般都可在Java 集成编辑环境中进行相应设置,也可由Ant 等调用che
9、ckstyle 等来进行自动规整。2.2 缩进子功能块当在其父功能块后缩进。当功能块过多而导致缩进过深时当将子功能块提取出来做为子函数。代码中以 TAB(4 个字符)缩进,在编辑器中请将TAB 设置为以空格替代,否则在不同编辑器或设置下会导致TAB 长度不等而影响整个程序代码的格式。例如:Table1缩进示例public void methodName()if(some condition)for()/some sentences/end for/end if 名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 34 页 -第 6 页 共 34 页2.3 长度为便于阅读和理解,单个函
10、数的有效代码长度当尽量控制在100 行以内(不包括注释行),当一个功能模块过大时往往造成阅读困难,因此当使用子函数等将相应功能抽取出来,这也有利于提高代码的重用度。单个类也不宜过大,当出现此类情况时当将相应功能的代码重构到其他类中,通过组合等方式来调用,建议单个类的长度包括注释行不超过1500 行。尽量避免使用大类和长方法。2.4 行宽页宽应该设置为80 字符。一般不要超过这个宽度,这会导致在某些机器中无法以一屏来完整显示,但这一设置也可以灵活调整。在任何情况下,超长的语句应该在一个逗号后或一个操作符前折行。一条语句折行后,应该比原来的语句再缩进一个TAB 或 4 个空格,以便于阅读。2.5
11、间隔类、方法及功能块间等应以空行相隔,以增加可读性,但不得有无规则的大片空行。操作符两端应当各空一个字符以增加可读性。相应独立的功能模块之间可使用注释行间隔,并标明相应内容,具体参看附录的代码示例2.6 对齐关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。连续赋值时当对齐操作符。当方法参数过多时当在每个参数后(逗号后)换行并对齐。当控制或循环中的条件比较长时当换行(操作符前)、对齐并注释各条件。变量定义最好通过添加空格形成对齐,同一类型的变量应放在一起。如下例所示:Table2对齐示例/变量对齐-int count=100;int length=0;String strUser
12、Name=null;Integer porductCode=new Integer(2);/产品编码数组/参数对齐-public Connection getConnection(String url,String userName,String password)throws SQLException,IOException 名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 34 页 -第 7 页 共 34 页/换行对齐-public final static String SQL_SELECT_PRODUCT=“SELECT*“+“FROM TProduct WHERE Pro
13、d_ID=”+“prodID”;/条件对齐-if(Condition1/当条件一&Condition2/并且条件二|Condition3)/或者条件三/Code*for(int i=0;i productCount.length;/循环终止条件i+)/Code*2.7 括号 中的语句应该单独作为一行,左括号 当紧跟其语句后,右括号 永远单独作为一行且与其匹配行对齐,并尽量在其后说明其匹配的功能模块。较长的方法以及类、接口等的右括号后应使用/end.等标识其结束。如:类的结束符:/EOC ClassName,方法结束符:/end methodName(),功能块结束:/end if.userNa
14、me is null?循环快结束:/end for.every user in userList 不要在程序中出现不必要的括号,但有时为了增加可读性和便于理解,当用括号限定相应项。左括号是否换行等随个人习惯而定,若换行则当与其前导语句首字符对齐。第3章 注释3.1 基本原则1)注释应该增加代码的清晰度。代码注释的目的是要使代码更易于被其他开发人员等理解。2)如果你的程序不值得注释,那么它很可能也不值得运行。3)避免使用装饰性内容。4)保持注释的简洁。名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 34 页 -第 8 页 共 34 页5)注释信息不仅要包括代码的功能,还应给出原因。
15、6)不要为注释而注释。7)除变量定义等较短语句的注释可用行尾注释外,其他注释当避免使用行尾注释。3.2 JavaDoc 对类、方法、变量等的注释需要符合JavaDoc 规范,对每个类、方法都应详细说明其功能、条件、参数等,并使用良好的HTML标记格式化注释,以使生成的JavaDoc 易阅读和理解。类注释中当包含版本和作者信息,使用 CVS 标记自动跟踪版本变化和修改记录,具体内容参见CVS 使用手册及下面几节的相应内容等,CVS 标识符请参加附录中的CVS 标识符。3.3 文件与包注释在每个文件、包的头部都应该包含该文件的功能、作用、作者、版权以及创建、修改记录等。并在其中使用CVS 标记自动
16、跟踪版本变化及修改记录等信息。注意是/*/注释而不是/*/JavaDoc注释。文件注释模板见附件注释模板中的文件注释部分。版权声明部分请参见附件版权声明并注意更新到最新版本。Table3 文件注释示例:/*=*$Id:User.java,v 1.1 2002/09/07 14:36:23 l_zhy Exp$*Created:2003-3-23 20:18:53 by l_zhy*=*ProjectName*Description*=*Copyright Information.*=*/每个包当有包注释,在源码及JavaDoc 相应包路径下建立package.html 以描述包的功能、作用等。
17、3.4 类、接口注释在类、接口定义之前当对其进行注释,包括类、接口的目的、作用、功能、继承于何种父名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 34 页 -第 9 页 共 34 页类,实现的接口、实现的算法、使用方法、示例程序等,在作者和版本域中使用CVS 标记自动跟踪版本变化等,具体参看附件注释模板中相关部分。Table4 类注释示例/*字符串实用类。*定义字符串操作时所需要用到的方法,如转换中文、HTML 标记处理等。*author$Author:l_zhy$*version$Revision:1.2$Date:2003/05/15 02:10:27$*/public cl
18、ass StringUtil?3.5 方法注释依据标准 JavaDoc 规范对方法进行注释,以明确该方法功能、作用、各参数含义以及返回值等。复杂的算法用/*/在方法内注解出。参数注释时当注明其取值范围等返回值当注释出失败、错误、异常时的返回情况。异常当注释出什么情况、什么时候、什么条件下会引发什么样的异常Table5 方法注释示例/*执行查询。*该方法调用Statement 的 executeQuery(sql)方法并返回ResultSet*结果集。*param sql 标准的 SQL 语句*return ResultSet 结果集,若查询失败则返回null*throws SQLExcepti
19、on 当查询数据库时可能引发此异常*/public ResultSet executeQuery(String sql)throws SQLException /Statement 和 SQL 语句都不能为空if(null!=stmt&!StringUtil.isEmpty(sql)/返回查询执行结果return stmt.executeQuery(sql);return null;名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 34 页 -第 10 页 共 34 页/end executeQuery()3.6 其他注释应对重要的变量加以注释,以说明其含义等。应对不易理解的分支条
20、件表达式加注释。不易理解的循环,应说明出口条件。过长的方法实现,应将其语句按实现的功能分段加以概括性说明。对于异常处理当注明正常情况及异常情况或者条件,并说明当异常发生时程序当如何处理。3.7 注释参考表Table6 注释参考表序号项目注释内容1 参数参数类型参数用来做什么约束或前提条件示例2 字段/属性字段描述注释所有使用的常量示例并行事件可见性决策3 类类的目的已知的问题类的开发/维护历史、版本注释出采用的常量并行策略4 编译单元(文件)每一个类/类内定义的接口,含简单的说明文件名和/或标识信息修改/维护记录版权信息5 获取成员函数若可能,说明为什么使用滞后初始化6 接口目的明确它应如何被
21、使用以及如何不被使用7 局部变量用处/目的8 成员函数注释成员函数做什么以及它为什么做这个哪些参数必须传递给一个成员函数成员函数返回什么已知的问题任何由某个成员函数抛出的异常可见性决策成员函数是如何改变对象的包含任何修改代码的历史如何在适当情况下调用成员函数的例子名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 34 页 -第 11 页 共 34 页适用的前提条件和后置条件9 成员函数内部注释控制结构代码做了些什么以及为什么这样做局部变量难或复杂的代码处理顺序10 包包的功能和用途第4章 命名4.1 基本原则规范的命名能使程序更易阅读,从而更易于理解。它们也可以提供一些标识功能方
22、面的信息,有助于更好的理解代码和应用。1)使用可以准确说明变量/字段/类/接口/包等的完整的英文描述符。例如,采用类似firstName,listAllUsers 或 CorporateCustomer 这样的名字,严禁使用汉语拼音及不相关单词命名,虽然Java支持 Unicode 命名,但本规范规定对包、类、接口、方法、变量、字段等不得使用汉字等进行命名。2)采用该领域的术语。如果用户称他们的“客户”(clients)为“顾客”(customers),那么就采用术语Customer 来命名这个类,而不用Client。3)采用大小写混合,提高名字的可读性。一般应该采用小写字母,但是类和接口的名
23、字的首字母,以及任何中间单词的首字母应该大写。包名全部小写。4)尽量少用缩写,但如果一定要使用,当使用公共缩写和习惯缩写等,如实现(implement)可缩写成 impl,经理(manager)可缩写成 mgr 等,具体参看附录之常用缩写简表,严禁滥用缩写。5)避免使用长名字(最好不超过25 个字母)。6)避免使用相似或者仅在大小写上有区别的名字。7)避免使用数字,但可用2 代替 to,用 4 代替 for 等,如:go2Jsp。4.2 文件、包1)文件名当与其类严格相同,所有单词首字母大写。2)包名一般以项目或模块名命名,少用缩写和长名,一律小写。3)基本包:com.catv,所有包、文件都
24、从属于此包。4)包名按如下规则组成:基本包.项目名.模块名.子模块名.如:com.catv.search com.catv.j2ee.dao.hibernate 5)不得将类直接定义在基本包下,所有项目中的类、接口等都当定义在各自的项目和模名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 34 页 -第 12 页 共 34 页块包中。4.3 类、接口所有单词首字母大写。使用能确切反应该类、接口含义、功能等的词。一般采用名词。接口可带I 前缀或 able、ible、er 等后缀。4.4 字段常量采用完整的英文大写单词,在词与词之间用下划线连接,如:DEFAULT_V ALUE 变量
25、和参数对 不 易 清 楚 识 别 出 该 变 量 类 型 的 变 量 应 使 用 类 型 缩 写 作 其 前 缀,如 字 符 串 使 用strXXX,boolean 使用 isXXX,hasXXX 等等。除第一各个单词外其余单词首字母大写。对私有实例变量可使用_前缀,但在其存取方法中则应该将其前缀去掉。组件/部件应采用完整的英文描述符命名组件(接口部件),遵循匈牙利命名法则如:btnOK,lblName。集合一个集合,例如数组和矢量,应采用复数命名来表示队列中存放的对象类型。命名应采用完整的英文描述符,名字中所有非开头的单词的第一个字母应大写,适当使用集合缩写前缀。如:Vector vProd
26、ucts=new Vector();/产品向量Array aryUsers=new Array();/用户列表神秘的数我们在程序里经常会用到一些量,它是有特定的含义的。例如,现在我们写一个薪金统计程序,公司员工有50 人,我们在程序里就会用50 这个数去进行各种各样的运算。在这里,50就是 神秘的数。当别的程序员在程序里看到50 这个数,将很难知道它的含义,造成理解上的困难。名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 34 页 -第 13 页 共 34 页在程序里出现神秘的数 会降低程序的可读性、可维护性和可扩展性,故规定不得出现此类神秘的数。避免的方法是把神秘的数定义为一
27、个常量。注意这个常量的命名应该能表达该数的意义,并且应该全部大写,以与对应于变量的标识符区别开来。例如上面50 这个数,我们可以定义为一个名为NUM_OF_EMPLOYEES的常量来代替。这样,别的程序员在读程序的时候就可以容易理解了。其他命名时应使用复数来表示它们代表多值。如:orderItems。4.5 方法方法的命名应采用完整的英文描述符,大小写混合使用:所有中间单词的第一个字母大写。方法名称的第一个单词常常采用一个有强烈动作色彩的动词。取值类使用get 前缀,设值类使用set前缀,判断类使用is(has)前缀。例:getName()setSarry()isLogon()方法参数建议顺序
28、:(被操作者,操作内容,操作标志,其他?)public void replace(String sourceStr,/源字串String oldStr,/被替换字串String newStr)/替换为字串/Code*异常异常类名由表示该异常类型的单词和Exception 组成,如 ActionException。异常实例一般使用 e、ex 等,在多个异常时使用该异常名或简写加E,Ex 等组成,如:SQLEx ActionEx 4.6 命名约定表Table7 命名约定表序号操作项命名约定示例名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 34 页 -第 14 页 共 34 页1
29、参数使用传递值/对象的完整的英文描述符。userID 2 字段/属性字段采用完整的英文描述,第一个字母小写,任何中间单词的首字母大写。firstName 3 布尔型的获取成员函数所有的布尔型获取函数必须用单词is(has)做前缀。isString()hasMoney()4 类采用完整的英文描述符,所有单词的第一个字母大写。Customer 5 编译单元文件使用类或接口的名字,或者如果文件中除了主类之外还有多个类时,加上前缀java 来说明它是一个源码文件。Customer.java 6 部件/组件使用完整的英文描述来说明组件的用途,将组件类型使用匈牙利命名法则作其前缀。btnOK,cboTyp
30、eList 7 构造函数使用类名Customer()8 析构函数Java 没有析构函数,但一个对象在垃圾收集时,调用成员函数finalize()。finalize()9 异常类名由表示该异常类型等的单词和 Exception 组成SQLException ActionException 10 异常实例名通常采用字母e、ex 表示异常。多个异常时使用异常名或其简写加E、Ex 等构成e SQLEx 11 静态常量字段(常量)全部采用大写字母,单词之间用下划线分隔。采用静态常量获取成员函数。DEFAULT_NAME 12 获取成员函数被访问字段名的前面加上前缀 get。getUserName()13
31、 接口采用完整的英文描述符说明接口封装,所有单词的第一个字母大写。使用 I 前缀,IRunnable IPrompter 名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 34 页 -第 15 页 共 34 页其后使用 able,.ible 或者er等后缀,但这不是必需的。14 局部变量采用完整的英文描述符,第一个字母小写,但不要隐藏已有字段。例如,如果有一个字段叫firstName,不要让 一 个 局 部 变量 叫firstName。strName,totalMoney 15 循环计数器通常采用字母i,j,k 或者counter,index i,j,k,count,index
32、16 包采用完整的英文描述符,所有单词都小写,多个单词以下划线相连。所有包都属于com.info800so com.info800so.quasar com.info800so.j2ee.dao 17 成员函数采用完整的英文描述说明成员函数功能,第一个单词尽可能采用一个生动的动词,除第一个单词外,每个单词第一个字母小写。openFile()addUser()18 设置成员函数被访问字段名的前面加上前缀 set。setName()setPower()第5章 声明5.1 基本原则声明的基本原则是遵守Java 语言规范,并遵从习惯用法。5.2 包在导入包时当完全限制代码所使用的类的名字,尽量少用通配
33、符的方式,但导入一些通用包,或用到一个包下大部分类时,则可是使用通配符方式,如:import com.catv.quasar.services.Service;import java.util.*;同一包中的类导入时当声明在一起,可由编辑器自动完成此功能。重要的包当添加注释。名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 34 页 -第 16 页 共 34 页5.3 类、接口类、接口定义语法规范:可见性(abstract|final)Class|Interface class_name(extends|implements)父类或接口名 如:public class Login
34、Action extends BaseAction implemnets ActionListener 5.4 方法良好的程序设计应该尽可能减小类与类之间耦合,所遵循的经验法则是:尽量限制成员函数的可见性。如果成员函数没必要公有(public),就定义为保护(protected);没必要保护(protected),就定义为私有(private)。方法定义语法规范:可见性(abstract|final)synchronized 返回值类型 method_name(参数列表)(throws)异常列表 /功能模块 如:public List listAllUsers()throws DAOExcep
35、tion 若有 toString(),equals(),hashCode(),colone()等重载自Object 的方法,应将其放在类的最后。声明顺序:1)构造方法2)静态公共方法3)静态私有方法4)受保护方法5)私有方法6)继承自 Object 的方法5.5 字段字段定义语法规范:(,public?|?private?|?protected?)(,final?|?volatile?),static?,transient?data_type field_name ,=?expression,;?若没有足够理由,不要把实例或类变量声明为公有。公共和保护的可见性应当尽量避免,名师资料总结-精品资
36、料欢迎下载-名师精心整理-第 16 页,共 34 页 -第 17 页 共 34 页所有的字段都建议置为私有,由获取和设置成员函数(Getter、Setter)访问。不允许“隐藏”字段,即给局部变量所取的名字,不可与另一个更大范围内定义的字段的名字相同(或相似)。例如,如果把一个字段叫做firstName,就不要再生成一个局部变量叫做firstName,或者任何易混肴的名字,如fistName。数组声明时当将 跟再类型后,而不时字段名后,如:Integer ai=new Integer(2);/一个整数对象数组,用于.Integer aj=new Integer(3);/不要用这种数组声明方式一
37、行代码只声明一个变量,仅将一个变量用于一件事。声明顺序:1)常量2)类变量3)实例变量4)公有字段5)受保护字段6)私有字段可以将私有变量声明在类或接口的最后。注意受保护变量、私有变量、“包”变量间的区别。5.6 示例Table8/常量-public final static double PI=3.141592653589793;/-类变量protected static String key=“Love”;/-实例变量/共有字段-public String userName=“Tom”;/受保护字段-protected float price=0.0;/友元字段-Vector vPordu
38、cts=null;/私有字段-private int count;/构造方法-public Constructor()/公共方法-public String getUserName()/友元方法-名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 34 页 -第 18 页 共 34 页void createProduct()/受保护方法-protected void convert()/私有方法-private void init()/重载 Object 方法-public String toString()/main 方法-public static void main(Stri
39、ng args)第6章 类与接口6.1 基本原则类的划分粒度,不可太大,造成过于庞大的单个类,也不可太细,从而使类的继承太深。一般而言,一个类只做一件事;另一个原则是根据每个类的职责进行划分,比如用User 来存放用户信息,而用UserDAO 来对用户信息进行数据访问操作(比如存取数据库),用 UserBroker来封装用户信息的业务操作等等。多使用设计模式,随时重构。多个类中使用相同方法时将其方法提到一个接口中或使用抽象类,尽量提高重用度。将不希望再被继承的类声明成final,例如某些实用类,但不要滥用final,否则会对系统的可扩展性造成影响。将不希望被实例化的类的缺省构造方法声明成pri
40、vate。6.2 抽象类与接口一般而言:接口定义行为,而抽象类定义属性和公有行为,注意两者间的取舍,在设计中,可由接口定义公用的行为,由一个抽象类来实现其部分或全部方法,以给子类提供统一的行为定义,可参考Java 集合等实现。多使用接口,尽量做到面向接口的设计,以提高系统的可扩展性。6.3 继承与组合尽量使用组合来代替继承,一则可以使类的层次不至于过深,而且会使类与类,包与包之间的耦合度更小,更具可扩展性。名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 34 页 -第 19 页 共 34 页6.4 构造函数和静态工厂方法当需要使用多个构造函数创建类时,建议使用静态工厂方法替代这
41、些构造方法(参考Effictive Java Item1),例如:public class User public User()super();/do somethings to create user instance public static User getInstance(String name,String password)User u=new User();u.setName(name);u.setPassword(password);return u;参看 String,Boolean 的实现等:String.valueOf(Long l),Boolean.valueOf(S
42、tring).6.5 toString(),equals(),hashCode().每个类都应该重载toString()方法,以使该类能输出必要和有用的信息等。/*see java.lang.Object#toString()*/public String toString()final StringBuffer sb=new StringBuffer(Actor:);sb.append(ID=).append(_id).append(,Name=).append(_name).append();return sb.toString();若一个类需要重载equals()方法,则必须同时重载ha
43、shCode()方法实现方式参考Effictive JavaItem7,Item8/*see java.lang.Object#equals(java.lang.Object)*/public boolean equals(Object obj)/空值if(null=obj)return false;名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 34 页 -第 20 页 共 34 页/引用相等if(obj=this)return true;/判断是否为当前类实例if(!(obj instanceof Actor)return false;/若 ID 相等则认为该对象相等ret
44、urn this._id=(Actor)obj).getId();/*see java.lang.Object#hashCode()*/public int hashCode()int result=17;/init result/String 对象 hashCode result=(37*result)+_name.hashCode();/数值result=(37*result)+(int)(_id (_id 32);/String 对象 hashCode result=(37*result)+_description.hashCode();return result;这些方法的重载实现也可
45、参考如下实现(使用Jakarta commons-lang);6.6 Singleton Class 单例类使用如下方式声明,并将其缺省构造方法声明成private:public class Singleton private static Singleton instance=new Singleton();/私有缺省构造方法,避免被其他类实例化private Singleton()/do something public static Singleton getInstance()if(null=instance)instance=new Singleton;名师资料总结-精品资料欢迎下载
46、-名师精心整理-第 20 页,共 34 页 -第 21 页 共 34 页 return instance;/EOC Singleton 单例类若需要实现序列化,则必须提供readResolve()方法,以使反序列化出来的类仍然是唯一的实例,参考Effictive Java Item57。第7章 方法7.1 基本原则一个方法只完成一项功能,在定义系统的公用接口方法外的方法应尽可能的缩小其可见性。避免用一个类是实例去访问其静态变量和方法。避免在一个较长的方法里提供多个出口:/不要使用这钟方式,当处理程序段很长时将很难找到出口点if(condition)return A;else return B;
47、/建议使用如下方式String result=null;if(condition)result=A;else result=B;return result;7.2 参数和返回值避免过多的参数列表,尽量控制在5 个以内,若需要传递多个参数时,当使用一个容纳这些参数的对象进行传递,以提高程序的可读性和可扩展性。参数类型和返回值尽量接口化,以屏蔽具体的实现细节,提高系统的可扩展性,例如:public void joinGroup(List userList)public List listAllUsers()名师资料总结-精品资料欢迎下载-名师精心整理-第 21 页,共 34 页 -第 22 页 共
48、 34 页第8章 表达式与语句8.1 基本原则表达式和语句当清晰、简洁,易于阅读和理解,避免使用晦涩难懂的语句。每行至多包含一条执行语句,过长当换行。避免在构造方法中执行大量耗时的初始化工作,应当将这中工作延迟到被使用时再创建相应资源,如果不可避免,则当使用对象池和Cache 等技术提高系统性能。避免在一个语句中给多个变量赋相同的值。它很难读懂。不要使用内嵌(embedded)赋值运算符试图提高运行时的效率,这是编译器的工作。尽量在声明局部变量的同时初始化。唯一不这么做的理由是变量的初始值依赖于某些先前发生的计算。一般而言,在含有多种运算符的表达式中使用圆括号来避免运算符优先级问题,是个好方法
49、。即使运算符的优先级对你而言可能很清楚,但对其他人未必如此。你不能假设别的程序员和你一样清楚运算符的优先级。不要为了表现编程技巧而过分使用技巧,简单就好。8.2 控制语句判断中如有常量,则应将常量置与判断式的右侧。如:if(true=isAdmin().if(null=user).尽量不使用三目条件判断。所有 if 语句必须用 包括起来,即便是只有一句:if(true)/do something.if(true)i=0;/不要使用这种当有多个else分句时当分别注明其条件,注意缩进并对齐,如:/先判断 i 是否等于 1 if(i=1)/if_1/./然后判断i=2 else if(i=2)/i
50、=2 说明。名师资料总结-精品资料欢迎下载-名师精心整理-第 22 页,共 34 页 -第 23 页 共 34 页j=i;/如果都不是(i 2|i 1)else/说明出错了/./end if_1 过多的 else分句请将其转成switch 语句或使用子函数。每当一个 case顺着往下执行时(因为没有 break 语句),通常应在break 语句的位置添加注释。如:switch(condition)case ABC:/statements;/继续下一个CASE case DEF:/statements;break;case XYZ:/statements;break;default:/state