下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 JAVA编码规范

JAVA编码规范.doc

JAVA编码规范

张君义
2017-09-28 0人阅读 举报 0 0 暂无简介

简介:本文档为《JAVA编码规范doc》,可适用于IT/计算机领域

JAVA编码规范Java开发规范第页本规范的目的是使本组织能以标准的、规范的方式设计和编码。通过建立编码规范以使每个开发人员养成良好的编码风格和习惯并以此形成开发小组编码约定提高程序的可靠性、可读性、可修改性、可维护性和一致性等增进团队间的交流并保证软件产品的质量。《Java编程指南》见RUP(RationalUnifiedProcess)中文版。《Java技术手册》(JavainaNutshell)《SunJava语言编码规范》(JavaCodeConventions)《EffictiveJava》《JavaPitfalls》《JavaRules》对于代码首要要求是它必须正确能够按照设计预定功能去运行第二是要求代码必须清晰易懂使自己和其他的程序员能够很容易地理解代码所执行的功能等。然而在实际开发中每个程序员所写的代码却经常自成一套很少统一导致理解困难影响团队的开发效率及系统的质量等。因此一份完整并被严格执行的开发规范是非常必须的特别是对软件公司的开发团队而言。最根本的原则:代码虽然是给机器运行的但却是给人读的!代码的组织和风格的基本原则是:便于自己的开发易于与他人的交流。第页操作指南代码的组织格式直接采用Eclipse内建的Formatter格式使用Format功能组织文件即可。,注释应该增加代码的清晰度。代码注释的目的是要使代码更易于被其他开发人员理解。,如果你的程序不值得注释那么它很可能也不值得运行。,避免使用装饰性内容。,保持注释的简洁。,注释信息不仅要包括代码的功能还应给出原因。,不要为注释而注释。,除变量定义等较短语句的注释可用行尾注释外其他注释当避免使用行尾注释。对类接口、非私有方法、非私有变量等的注释必须使用JavaDoc注释。操作指南:)导入注释模版为Eclipse所有工程导入注释模版:a)菜单Window>PreferencesJava>CodeStyle>CodeTemplatesb)用Import命令导入附录中的Eclipse代码注释模板文件。为Eclipse单个工程导入注释模版:a)菜单Project>PropertiesJavaCodeStyle>CodeTemplatesb)用Import命令导入附录中的Eclipse代码注释模板文件。)编写Java类接口时在类接口、非私有方法、非私有变量的上一行用**前导并回车可自动产生JavaDoc注释的格式将x修改为实际的内容。)在非私有方法的JavaDoc注释的补充说明一般有参数有返回值有异常的方法自动生成的注释类似如下(不包括红色字体的内容):****方法的一句话概述(注:句号不能删除本注应删除)。第页*<p>方法详述(简单方法可不必详述)<p>*params说明参数含义*return说明返回值含义*throwsIOException说明发生此异常的条件*throwsPointerException说明发生此异常的条件*默认生成的JavaDoc注释没有这些红色字体的内容它们必须被填入实际内容才能产生优美格式的JavaDoc文档。以下情况必须添加注释:,私有方法除构造函数外必须添加该方法的注释(JavaDoc注释或非JavaDoc注释均可)。,复杂方法(如方法体超过行)或包含关键算法的方法必须对内部的操作步骤添加注释(行注释或块注释**均可)。,方法内部多次转换含义的变量必须对该变量的含义发生变化时添加注释。,方法内部存在不易理解的多个分支条件的表达式必须对每个分支添加注释。,对于引入的工程外、非Java内建类库的、不常见的包与类在行末或上一行添加行注释。,重要的包必须添加注释。以下情况可不必添加注释:,PO类的属性(私有变量)由于已经在getset方法内添加JavaDoc注释因此可不必添加。,构造函数。非项目自有的应用或包的配置文件内增加新参数或者需要维护人员修改的参数必须增加注释注释内容包括:含义默认值设置范围。项目自有的配置文件必须为每个参数增加注释注释内容包括:含义默认值设置范围。基本原则第页规范的命名能使程序更易阅读从而更易于理解。它们也可以提供一些标识功能方面的信息有助于更好的理解代码和应用。,使用可以准确说明变量字段类接口包等的完整的英文描述符。例如采用类似firstNamelistAllUsers或CorporateCustomer这样的名字尽量不使用汉语拼音及不相关单词命名严禁使用汉语拼音首字母组合命名虽然Java支持Unicode命名但本规范规定对包、类、接口、方法、变量、字段等不得使用汉字等进行命名。,采用该领域的术语。如果用户称他们的“客户”(clients)为“顾客”(customers)那么就采用术语Customer来命名这个类而不用Client。,采用大小写混合提高名字的可读性。一般应该采用小写字母但是类和接口的名字的首字母以及任何中间单词的首字母应该大写。包名全部小写。,避免使用长名字(最好不超过个字母)。,避免使用相似或者仅在大小写上有区别的名字。,避免使用数字但可用代替to用代替for等如:goJsp。文件、包,文件名当与其类严格相同所有单词首字母大写。,包名一般以项目或模块名命名少用缩写和长名一律小写。,基本包:comaspire所有包、文件都从属于此包。,包名按如下规则组成:基本包项目名模块名子模块名如:comaspirequasarcomaspiredaooracle,不得将类直接定义在基本包下所有项目中的类、接口等都当定义在各自的项目和模块包中。类、接口所有单词首字母大写。使用能确切反应该类、接口含义、功能等的词。一般采用名词。接口可带I前缀或able、ible、er等后缀。第页字段,常量采用完整的英文大写单词在词与词之间用下划线连接如:DEFAULTVALUE,变量和参数对不易清楚识别出该变量类型的变量应使用类型缩写作其前缀如字符串使用strXXX,boolean使用isXXXhasXXX等等。除第一各个单词外其余单词首字母大写。对私有实例变量可使用前缀但在其存取方法中则应该将其前缀去掉。,组件部件应采用完整的英文描述符命名组件(接口部件)遵循匈牙利命名法则如:btnOKlblName。,集合一个集合例如数组和矢量应采用复数命名来表示队列中存放的对象类型。命名应采用完整的英文描述符名字中所有非开头的单词的第一个字母应大写适当使用集合缩写前缀。如:VectorvProducts=newVector()产品向量ArrayaryUsers=newArray()用户列表,神秘的数在程序里经常会用到一些量它是有特定的含义的。例如现在我们写一个薪金统计程序公司员工有人我们在程序里就会用这个数去进行各种各样的运算。在这里就是"神秘的数"。当别的程序员在程序里看到这个数将很难知道它的含义造成理解上的困难。在程序里出现"神秘的数"会降低程序的可读性、可维护性和可扩展性故规定不得出现此类"神秘的数"。避免的方法是把神秘的数定义为一个常量。注意这个常量的命名应该能表达该数的意义并且应该全部大写以与对应于变量的标识符区别开来。例如上面这个数我们可以定义为一个名为NUMOFEMPLOYEES的常量来代替。这样别的程序员在读程序的时候就可以容易理解了。,其他命名时应使用复数来表示它们代表多值(数组)。如:orderItems。方法第页方法的命名应采用完整的英文描述符大小写混合使用:所有中间单词的第一个字母大写。方法名称的第一个单词常常采用一个有强烈动作色彩的动词。类中常用方法的命名:类的获取方法(一般具有返回值)一般要求在被访问的字段名前加上get如getFirstName()getLastName()。类的设置方法(一般返回类型为void):被访问字段名的前面加上前缀set如setFirstName(),setLastName()类的布尔型的判断方法一般要求方法名使用单词is做前缀如isPersistent()isString()。或者使用具有逻辑意义的单词例如equal或equals。类的普通方法一般采用完整的英文描述说明成员方法功能第一个单词尽可能采用动词首字母小写如openFile()addCount()。构造方法应该用递增的方式写。(参数多的写在后面)。toString()方法:一般情况下每个类都应该定义toString(),其格式为:publicStringtoString(){…}。异常异常类名由表示该异常类型的单词和Exception组成如ActionException。异常实例一般使用e、ex等在多个异常时使用该异常名或简写加EEx等组成如:SQLExActionEx声明的基本原则是遵守Java语言规范并遵从习惯用法。在导入包时当完全限制代码所使用的类的名字,尽量少用通配符的方式但导入一些通用包或用到一个包下大部分类时则可是使用通配符方式如:第页importcomaspirequasarservicesServiceimportjavautil*同一包中的类导入时当声明在一起可由编辑器自动完成此功能。重要的包当添加注释。类、接口定义语法规范:可见性('abstract'|'final')Class|Interfaceclassname('extends'|'implements')父类或接口名{}如:publicclassLoginActionextendsBaseActionimplemnetsActionListener{}良好的程序设计应该尽可能减小类与类之间耦合所遵循的经验法则是:尽量限制成员函数的可见性。如果成员函数没必要公有(public)就定义为保护(protected)没必要保护(protected)就定义为私有(private)。方法定义语法规范:可见性('abstract'|'final')'synchronized'返回值类型methodname(参数列表)('throws')异常列表{功能模块}如:publicListlistAllUsers()throwsDAOException{}若有toString(),equals(),hashCode(),colone()等重载自Object的方法应将其放在类的最后。第页声明顺序:构造方法静态公共方法公共方法静态私有方法受保护方法私有方法继承自Object的方法字段定义语法规范:(‘public’|’private’|’protected’)(‘final’|’volatile’)‘static’‘transient’datatypefieldname‘=’expression‘’若没有足够理由不要把实例或类变量声明为公有。公共和保护的可见性应当尽量避免所有的字段都建议置为私有由获取和设置成员函数(Getter、Setter)访问。不允许“隐藏”字段即给局部变量所取的名字不可与另一个更大范围内定义的字段的名字相同(或相似)。例如如果把一个字段叫做firstName就不要再生成一个局部变量叫做firstName或者任何易混肴的名字如fistName。数组声明时当将""跟在类型后而不是字段名后如:Integerai=newInteger一个整数对象数组用于Integeraj=newInteger不要用这种数组声明方式一行代码只声明一个变量仅将一个变量用于一件事。声明顺序:常量类变量实例变量第页公有字段受保护字段私有字段可以将私有变量声明在类或接口的最后。注意受保护变量、私有变量、“包”变量间的区别。类的划分粒度不可太大造成过于庞大的单个类也不可太细从而使类的继承太深。一般而言一个类只做一件事另一个原则是根据每个类的职责进行划分比如用User来存放用户信息而用UserDAO来对用户信息进行数据访问操作(比如存取数据库)用UserBroker来封装用户信息的业务操作等等。多使用设计模式随时重构。多个类中使用相同方法时将其方法提到一个接口中或使用抽象类尽量提高重用度。将不希望再被继承的类声明成final例如某些实用类但不要滥用final否则会对系统的可扩展性造成影响。将不希望被实例化的类的缺省构造方法声明成private。一般而言:接口定义行为而抽象类定义属性和公有行为注意两者间的取舍在设计中可由接口定义公用的行为由一个抽象类来实现其部分或全部方法以给子类提供统一的行为定义可参考Java集合等实现。多使用接口尽量做到面向接口的设计以提高系统的可扩展性。尽量使用组合来代替继承一则可以使类的层次不至于过深而且会使类与类包与包之间的耦合度更小更具可扩展性。尽量避免在深度继承的类的构造函数中建立对象。当需要使用多个构造函数创建类时建议使用静态工厂方法替代这些构造方法(参考《EffictiveJava》Item)例如:publicclassUser{publicUser(){super()dosomethingstocreateuserinstance}第页publicstaticUsergetInstance(Stringname,Stringpassword){Useru=newUser()usetName(name)usetPassword(password)returnu}一个方法只完成一项功能在定义系统的公用接口方法外的方法应尽可能的缩小其可见性。避免用一个类是实例去访问其静态变量和方法。避免在一个较长的方法里提供多个出口:不要使用这钟方式当处理程序段很长时将很难找到出口点if(condition){returnA}else{returnB}建议使用如下方式Stringresult=if(condition){result=A}else{result=B}returnresult避免过多的参数列表尽量控制在个以内若需要传递多个参数时当使用一个容纳这些参数的对象进行传递以提高程序的可读性和可扩展性。参数类型和返回值尽量接口化以屏蔽具体的实现细节提高系统的可扩展性例如:publicvoidjoinGroup(ListuserList){}publicListlistAllUsers(){}第页表达式和语句当清晰、简洁易于阅读和理解避免使用晦涩难懂的语句。每行至多包含一条执行语句过长当换行。避免在构造方法中执行大量耗时的初始化工作应当将这中工作延迟到被使用时再创建相应资源如果不可避免则当使用对象池和Cache等技术提高系统性能。避免在一个语句中给多个变量赋相同的值。它很难读懂。不要使用内嵌(embedded)赋值运算符试图提高运行时的效率这是编译器的工作。尽量在声明局部变量的同时初始化。唯一不这么做的理由是变量的初始值依赖于某些先前发生的计算。一般而言在含有多种运算符的表达式中使用圆括号来避免运算符优先级问题是个好方法。即使运算符的优先级对你而言可能很清楚但对其他人未必如此。你不能假设别的程序员和你一样清楚运算符的优先级。不要为了表现编程技巧而过分使用技巧简单就好。判断中如有常量则应将常量置于判断式的右侧。如:if(true==isAdmin())尽量不使用三目条件的嵌套。所有if语句必须用{}包括起来,即便是只有一句:if(true){dosomething}if(true)i=不要使用这种当有多个else分句时当分别注明其条件注意缩进并对齐如:先判断i是否等于if(i==){if第页}然后判断i==elseif(i==){i==说明。。。。。。j=i}如果都不是(i>||i<)else{说明出错了}endif过多的else分句请将其转成switch语句或使用子函数。每当一个case顺着往下执行时(因为没有break语句)通常应在break语句的位置添加注释。如:switch(condition){caseABC:statements继续下一个CASEcaseDEF:statementsbreakcaseXYZ:statementsbreakdefault:statementsbreak}endswitch循环中必须有终止循环的条件或语句避免死循环。当在for语句的初始化或更新子句中使用逗号时避免因使用三个以上变量而导致复杂度提高。若需要可以在for循环之前(为初始化子句)或for循环末尾(为更新子句)使用单独的语句。第页因为循环条件在每次循环中多会执行一次故尽量避免在其中调用耗时或费资源的操作比较一下两种循环的差异:不推荐方式while(index<productsgetCount()){每此都会执行一次getCount()方法若此方法耗时则会影响执行效率而且可能带来同步问题若有同步需求请使用同步块或同步方法}推荐方式将操作结构保存在临时变量里减少方法调用次数finalintcount=productsgetCount()while(index<count){},通常的思想是只对错误采用异常处理:逻辑和编程错误设置错误被破坏的数据资源耗尽等等。,通常的法则是系统在正常状态下以及无重载和硬件失效状态下不应产生任何异常。,最小化从一个给定的抽象类中导出的异常的个数。对于经常发生的可预计事件不要采用异常。不要使用异常实现控制结构。,确保状态码有一个正确值。,在本地进行安全性检查而不是让用户去做。,若有finally子句则不要在try块中直接返回亦不要在finally中直接返回。已检查异常必须捕捉并做相应处理不能将已检查异常抛到系统之外去处理。对可预见的运行时异常当进行捕捉并处理比如空指针等。通常对空指针的判断不是使用捕捉PointException的方式而是在调用该对象之前使用判断语句进行直接判断如:若不对list是否为进行检查则在其为时会抛出空指针异常第页if(!=list<listsize()){for(inti=i<listsize()i){}}建议使用运行时异常(RuntimeException)代替已检查异常(CheckedException)。异常的控制范围在数据访问层产生的Sql异常均向上抛出由业务层处理。在业务层捕获本层以及数据层的所有异常并处理。不将异常抛到表现层。多个异常应分别捕捉并处理避免使用一个单一的catch来处理。如:try{dosomething}catch(IllegalStateExceptionIllEx){IllExprintStackTrace()dealwithIllEx}catch(SQLExceptionSQLEx){SQLExprintStackTrace()throwSQLEx抛给调用者处理}finally{释放资源}字符串常量资源应该使用ResourceBundle方式提供。Eclipse代码注释模板文件(aspirecodetemplatesEclipsexml):示范类文件(JavaDocClass):第页示范类文件产生的JavaDoc文件:E:BOC企业工作流编码规范JavaDocClasshtml应该在编程中尽量避免这种“坏味道”。DuplicatedCode代码重复几乎是最常见的异味了。他也是Refactoring的主要目标之一。代码重复往往来自于copyandpaste的编程风格。Longmethod它是传统结构化的“遗毒“。一个方法应当具有自我独立的意图不要把几个意图放在一起。.LargeClass大类就是你把太多的责任交给了一个类。这里的规则是OneClassOneResponsibility。.DivergentChange一个类里面的内容变化率不同。某些状态一个小时变一次某些则几个月一年才变一次某些状态因为这方面的原因发生变化而另一些则因为其他方面的原因变一次。面向对象的抽象就是把相对不变的和相对变化相隔离。把问题变化的一方面和另一方面相隔离。这使得这些相对不变的可以重用。问题变化的每个方面都可以单独重用。这种相异变化的共存使得重用非常困难。.ShotgunSurgery第页这正好和上面相反。对系统一个地方的改变涉及到其他许多地方的相关改变。这些变化率和变化内容相似的状态和行为通常应当放在同一个类中。.FeatureEnvy对象的目的就是封装状态以及与这些状态紧密相关的行为。如果一个类的方法频繁用get方法存取其他类的状态进行计算那么你要考虑把行为移到涉及状态数目最多的那个类。.DataClumps某些数据通常像孩子一样成群玩耍:一起出现在很多类的成员变量中一起出现在许多方法的参数中„这些数据或许应该自己独立形成对象。.PrimitiveObsession面向对象的新手通常习惯使用几个原始类型的数据来表示一个概念。譬如对于范围他们会使用两个数字。对于Money他们会用一个浮点数来表示。因为你没有使用对象来表达问题中存在的概念这使得代码变的难以理解解决问题的难度大大增加。好的习惯是扩充语言所能提供原始类型用小对象来表示范围、金额、转化率、邮政编码等等。.SwitchStatement基于常量的开关语句是OO的大敌你应当把他变为子类、state或strategy。.ParallelInheritanceHierarchies并行的继承层次是shotgunsurgery的特殊情况。因为当你改变一个层次中的某一个类时你必须同时改变另外一个层次的并行子类。.LazyClass一个干活不多的类。类的维护需要额外的开销如果一个类承担了太少的责任应当消除它。.SpeculativeGenerality第页一个类实现了从未用到的功能和通用性。通常这样的类或方法唯一的用户是testcase。不要犹豫删除它。.TemporaryField一个对象的属性可能只在某些情况下才有意义。这样的代码将难以理解。专门建立一个对象来持有这样的孤儿属性把只和他相关的行为移到该类。最常见的是一个特定的算法需要某些只有该算法才有用的变量。.MessageChain消息链发生于当一个客户向一个对象要求另一个对象然后客户又向这另一对象要求另一个对象再向这另一个对象要求另一个对象如此如此。这时你需要隐藏分派。.MiddleMan对象的基本特性之一就是封装而你经常会通过分派去实现封装。但是这一步不能走得太远如果你发现一个类接口的一大半方法都在做分派你可能需要移去这个中间人。.InappropriateIntimacy某些类相互之间太亲密它们花费了太多的时间去砖研别人的私有部分。对人类而言我们也许不应该太假正经但我们应当让自己的类严格遵守禁欲主义。.AlternativeClasseswithDifferentInterfaces做相同事情的方法有不同的函数signature一致把它们往类层次上移直至协议一致。.IncompleteLibraryClass要建立一个好的类库非常困难。我们大量的程序工作都基于类库实现。然而如此广泛而又相异的目标对库构建者提出了苛刻的要求。库构建者也不是万能的。有时候我们会发现库类无法实现我们需要的功能。而直接对库类的修改有非常困难。这时候就需要用各种手段进行Refactoring。.DataClass第页对象包括状态和行为。如果一个类只有状态没有行为那么肯定有什么地方出问题了。.RefusedBequest超类传下来很多行为和状态而子类只是用了其中的很小一部分。这通常意味着你的类层次有问题。.Comments经常觉得要写很多注释表示你的代码难以理解。如果这种感觉太多表示你需要Refactoring。第页

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/23

JAVA编码规范

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利