还剩28页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
Java编码规范Java Codi ngStandard xxxxxx有限公司开发中心用锁;能锁区块,就不要锁整个方法体;能用对象锁,就不要用类锁说明尽可能使加锁的代码块工作量尽可能的小,避免在锁代码块中调用RPC方法规则
7.【强制】对多个资源、数据库表、对象同时加锁时,需要保持一致的加锁顺序,否则可能会造成死锁说明线程一需要对表A、B、C依次全部加锁后才可以进行更新操作,那么线程二的加锁顺序也必须是A、B、C,否则可能出现死锁规则
8.【强制】并发修改同一记录时,避免更新丢失,需要加锁要么在应用层加锁,要么在缓存加锁,要么在数据库层使用乐观锁,使用version作为更新依据说明如果每次访问冲突概率小于20%,推荐使用乐观锁,否则使用悲观锁乐观锁的重试次数不得小于3次规则
9.【强制】多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题规则10【.推荐】使用CountDownLatch进行异步转同步操作,每个线程退出前必须调用countdown方法,线程执行代码注意catch异常,确保countDown方法被执行到,避免主线程无法执行至await方法,直到超时才返回结果说明注意,子线程抛出异常堆栈,不能在主线程try-catch至上规则
11.【推荐】避免Random实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed导致的性能下降说明Random实例包括java.util.Random的实例或者Math.random的方式正例在JDK7之后,可以直接使用API ThreadLocalRandom,而在JDK7之前,需要编码保证每个线程持有•个实例规则
12.【推荐】在并发场景下,通过双重检查锁double-checked locking实现延迟初始化的优化问题隐患可参考TheDouble-Checked Lockingis BrokenDeclaration,推荐解决方案中较为简单一种适用于JDK5及以上版本,将目标属性声明为volatile型反例class Singleton{private Helperhelper=null;public HelpergetHelper{if helper==null synchronizedthis{if helper==null helper=new Helper;}return helper;//other methodsand fields...规则
13.【参考】volatile解决多线程内存不可见问题对于一写多读,是可以解决变量同步问题,但是如果多写,同样无法解决线程安全问题如果是count++操作,使用如下类实现Atomiclnteger count=new Atomiclnteger;count.addAndGet1;如果是JDK8,推荐使用LongAdder对象,比AtomicLong性能更好减少乐观锁的重试次数规则
14.【参考】HashMap在容量不够进行resize时由于高并发可能出现死链,导致CPU飙升,在开发过程中可以使用其它数据结构或加锁来规避此风险规则
15.【参考】ThreadLocal无法解决共享对象的更新问题,ThreadLocal对象建议使用static修饰这个变量是针对一个线程内所有操作共享的,所以设置为静态变量,所有此类实例共享此静态变量,也就是说在类第一次被使用时装载,只分配一块存储空间,所有此类的对象只要是这个线程内定义的都可以操控这个变最
4.文件格式
4.1头部注释规则1所有的源文件都应该在开头有一个c语言风格的注释,列出文件名、版本信息、日期以及文件更新过程信息等注释信息的基本格式如下每行不能超过80字符/**File name文件名*Version版本信息*Date日期*Description用于详细说明此文件中定义的类名、类的功能、类的继承关系等*Others其他内容说明*Function List:非类的函数列表,每条记录应包括函数名及功能*简要说明*
1.……*Class List定义的哪些类超过一个类的情况下*History修改历史记录列表,每条修改记录应包括修改口期、*修改者及修改内容简述*
1.Date*Author*Reason*Modification★*
4.2源文件布局规则1每个Java源文件都包含一个单一的公共类或接口若私有类和接口与一个公共类相关联,可以将它们和公共类放入同一个源文件公共类必须是这个文件中的第一个类或接口规则2类和接口声明的各个部分以及它们出现的先后次序见下表序号类/接口声明的各部分注解1类/接口文档注释该注释中所需包含的信息/**...*/2类或接口的声明3类/接口实现的注释/*……*/该注释应包含任何有关整个类或接口的信息,而这些信如果有必要的话息又不适合作为类/接口文档注释4类的静态变量首先是类的公共变量,随后是保护变量,最后是包一级别的变量(没有访问修饰符),最后是私有变量5实例变量首先是公共级别的,随后是保护级别的,最后是包一级别的(没有访问修饰符),最后是私有级别的6构造器7方法这些方法应该按功能,而非作用域或访问权限进行分组例如,一个私有的类方法可以置于两个公有的实例方法之间其目的是为了更便于阅读和理解代码示例package com.suntek.stockcrm.util;import java.util.Vector;*类名:DisTree.java*版本
1.0*日期2002/08/18*描述通用树形显示控件*作者tomzc*/public classDisTree{/***保存树形的原始结构内容,该树不做显示用,用于对显示的树进行添加删除操作*数据结构描述Vector-String
[5]*String[O]--funcid(功能TD)*String]—funcname(功自甘名秘;)*String
[2]-pfuncid(父功能ID)当没有父功能ID时该值为”null;*String
[3]-进行权限控制;当改值是disabled是改按钮变灰*String
[4]-保存该节点是否有子节点*/private Vectordisplay=null;/***保存得到焦点时的颜色*/private StringfocusColor=008888”;/***构造函数,用于只用来显示的树*@param display保存显示树的内容*/public DisTreeVectordisplay{this.display=display;/***设置得到焦点时显示的颜色*@param color颜色,格式FFFFFF*/public voidsetFocusColorString color{this.focusColor=color;
4.3排版格式规则1程序块要采用缩进风格编写,缩进的空格数为4个说明对于由开发工具自动生成的代码可以有不一致为了编程方便需要使用TAB键,则统一将TAB键的空格数设置为4(使用UNIX下的VI编辑器,其缺省TAB空格为8,需要修改为4)规则2注释要与所描述内容进行同样的缩排说明可使程序排版整齐,并方便注释的阅读与理解规则3尽量避免一行的长度超过80个字符,因为很多终端和工具不能很好处理之说明用于文档中的例子应该使用更短的行长,长度一般不超过70个字符规则4当一个表达式无法容纳在一行内时,可以依据如下一般规则断开之在一个逗号后面断开;在一个操作符前面断开;宁可选择较高级别higher-level的断开,而非较低级别lower-level的断开;新的一行应该与上一行同一级别表达式的开头处对齐;如果以上规则导致你的代码混乱或者使你的代码都堆挤在右边,那就代之以缩进8个空格示例1someMethodlongExpression1,longExpression2,longExpression3,longExpression4,longExpression5;var=someMethodl longExpressionl,someMethod2longExpression2,longExpression3;示例2longNamel=longName2*longName3+longName4-longName5+4*Iongname6;longNamel=longName2*longName3+longName4-longName5+4*Iongname6;说明以上是两个断开算术表达式的例子前者更好,因为断开处位于括号表达式的外边,这是个较高级别的断开,而后者则应避免出现示例3someMethodint anArg,Object anotherArg,String yetAnotherArg,Object andStillAnother{private staticsynchronized horkingLongMethodNameintanArg,Object anotherArg,String yetAnotherArg,Object andStillAnother{}说明以上是两个缩进方法声明的例子前者是常规情形后者若使用常规的缩进方式将会使第二行和第三行移得很靠右,所以代之以缩进8个空格示例4if conditionlcondition2||conditionscondition4||!condition5condition6{//BAD WRAPSdoSomethingAboutlt;if conditionlcondition2||conditionscondition4||!condition5condition6{doSomethingAboutlt;if conditionlcondition2||conditionscondition^||!condition5condition6{doSomethingAboutlt;)说明if语句的换行通常使用8个空格的规则,因为常规缩进(4个空格)会使语句体看起来比较费劲,故尽量避免第一种情况,而优先采用后两种情况
5.注释格式
5.1实现注释
5.
1.1块注释规则1块注释用于提供对文件,方法,数据结构和算法的描述块注释被置于每个文件的开始处以及每个方法之前它们也可以被用于其他地方,比如方法内部在功能和方法内部的块注释应该和它们所描述的代码具有一样的缩进格式规则2块注释之首应该有一个空行,用于把块注释和代码分割开来示例/**这是一个块注释*/
5.
1.2单行注释规则1短注释可以显示在一行内,并与其后的代码具有一样的缩进层级如果一个注释不能在一行内写完,就该采用块注释单行注释之前应该有一个空行示例if condition{/*处理条件*/
5.
1.3尾端注释规则1极短的注释可以与它们所要描述的代码位于同一行,但是应该有足够的空白来分开代码和注释若有多个短注释出现于大段代码中,它们应该具有相同的缩进示例:if a==2{return TRUE;/*特定情况*/}else{return isPrimea;/*只有当a不等于2时才执行*/
5.
1.4行末注释规则1注群界定符“〃”,可以注释掉整行或者一行中的一部分它一般不用于连续多行的注释文本然而,它可以用来注释掉连续多行的代码段示例1if foo1{//Do adouble-flip.else{return false;//Explain whyhere.}示例2//if bar1{//////Do atriple-flip.//...〃}//else{//return false;//
5.2文档注释规则i一个文档注释对应一个类、接口或成员,该注释位于声明之前,每个文档注释置于注释定界符/**...*/之中示例:/***Example类提供的功能7public classExample{...说明1文档注释描述Java的类、接口、构造器、方法,以及字段field说明2顶层top-level的类和接口是不缩进的,而其成员是缩进的描述类和接口的文档注释的第一行/**不需缩进;随后的文档注释每行都缩进1格使星号纵向对齐成员,包括构造函数在内,其文档注释的第一行缩进4格,随后每行都缩进5格说明3若想给出有关类、接口、变量或方法的信息,而这些信息又不适合写在文档中,则可使用实现块注释或紧跟在声明后面的单行注释例如,有关一个类实现的细节,应放入紧跟在类声明后面的实现块注释中,而不是放在文档注释中说明4文档注释不能放在一个方法或构造器的定义块中,因为Java会将位于文档注释之后的第一个声明与其相关联规则2对变量的定义和分支语句条件分支、循环语句等必须编写注释说明这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注释能帮助更好的理解程序,有时甚至优于看设计文档规则3对于switch语句下的case语句,如果因为特殊情况需要处理完一个case后进入下一个case处理,必须在该case语句处理完、下一个case语句前加上明确的注释说明这样比较清楚程序编写者的意图,有效防止无故遗漏break语句规则4避免在一行代码或表达式的中间插入注释说明除非必要,不应在代码或表达式中间插入注释,否则容易使代码可理解性变差建议1一般情况下,源程序有效注释量必须在20%以上边写代码边注释,修改代码同时修改相应注释,以保证注释与代码一致性没用的注释要及时删除修订记录表REVISION LISTVer.Rev DateAuthors Description版本日期作者更改情况描述
1.0a InitialDraft初稿
1.1a20XX/4/8增加并发处理和异常日志建议2注释应与其描述的代码相近,对代码的注释应放在其上方或右方相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开建议3避免在注释中使用缩写,特别是非常用缩写在使用缩写时或之前,应对缩写进行必要说明建议4通过对类、函数、变量等正确命名以及合理地组织代码的结构,使代码成为自注释的说明清晰准确的函数、变量等的命名,可增加代码可读性,并减少不必要的注释建议5在代码的功能、意图层次上进行注释,提供有用、额外的信息建议6在程序块的结束行右方加注释标记,以表明某程序块的结束说明当代码段较长,特别是多重嵌套时,这样做可以使代码更清晰,更便于阅读建议7注意应考虑程序易读及外观排版的因素,使用的语言若是中、英文兼有的,建议多使用中文,除非能用非常流利准确的英文表达说明注释语言不统一,影响程序易读性和外观排版,出于对维护人员的考虑,建议使用中文
6.编程惯例规则1不要随便把实例或类变量声明为公有规则2避免用•个对象访问一个类的静态变量和方法,应该用类名替代示例classMethod;〃正确ACIass.classMethod;〃正确anObject.classMethod;〃避免!规则3位于for循环中作为计数器值的数字常量,除了-1,0和1之外,不应被直接写入代码规则4避免在一个语句中给多个变量赋相同的值,因为它很难读懂示例fooBar.fChar=barFoo.lchar=c;〃避免!规则5不要使用内嵌赋值运算符试图提高运行时的效率示例d=a=b+c+r;〃避免!应该写成a=b+c;d=a+r;规则6在含有多种运算符的表达式中应使用圆括号来避免运算符优先级问题示例if a==bc==d//避免!if a==bc==d//正确规则7当一个包含二元运算符的表达式出现在三元运算符〃?〃的”〃之前时,应该给表达式添上一对圆括号示例x=0x:-x;规则8在注释中使用XXX来标识某些未实现的但可以工作的内容用FIXME来标识某些假的和错误的内容
7.其它规则
7.1声明规则1不允许把多个声明写在一行示例int taskLevel;//任务等级int taskType;//任务类型说明一行一个声明,这样有利于写注释,亦即,上面的写法要优于int taskLevel,taskType;规则2尽量在声明局部变量的同时初始化除非变量的初始值依赖于某些先前发生的计算规则3只在代码块的开始处声明变量一个块是指任何被包含在大括号和中间的代码,不要在首次用到该变量时才声明之示例void myMethod{int inti=0;//方法块的开始if condition{int int2=0;//if”块的开始说明这样做的目的是方便代码在该作用域内的可移植性该规则的一个例外是for循环的索引变量示例for int i=0;imaxLoops;i++{...}规则4编写类和接口时,遵循如下规则在方法名与其参数列表之前的左括号〃“间不要有空格;左大括号{位于声明语句同行的末尾;右大括号”}〃另起一行,与相应的声明语句对齐,除非是一个空语句示例class Sampleextends Object{int ivarl;int ivar2;Sampleint i,int j{ivarl=i;ivar2=j;int emptyMethod{}建议1方法与方法之间以空行分隔
7.2语句规则1不允许把多个简单语句写在一行中,即一行只写一条语句示例argv++;//正确argc-;//正确argv++;argc-;〃避免!规则2对复合语句包含在大括号中的语句序列,形如1语句}〃,要求:被括其中的语句应该较之复合语句缩进一个层次;左大括号〃{〃应位「复合语句起始行的行尾;右大括号}应另起一行并与夏合语句首行对齐;大括号可以被用于所有语句,包括单个语句,只要这些语句是诸如if-else或for控制结构的一部分说明这样便于添加语句而无需担心由于忘了加括号而引入bUgo规则3一个带返回值的return语句不使用小括号,除非它们以某种方式使返回值更为显见示例return;return myDisk.size;return sizesize:defaultsize;规贝!14if-else语句应该具有如下格式:if condition{statements;if condition{statements;}else{statements;if condition{statements;}else if condition{statements;}else{statements;建议if语句总是用{和〃}〃括起来,避免使用如下容易引起错误的格式ifcondition〃这里省略了括号{},应避免!statement;规则5一个for语句应该具有如下格式for initialization;condition;update{statements;说明一个空的for语句所有工作都在初始化,条件判断,更新子句中完成应该具有如下格式for initialization;condition;update;建议当在for语句的初始化或更新子句中使用逗号时,避免因使用三个以上变量,而导致复杂度提高若需要,可以在for循环之前为初始化子句或for循环末尾为更新子句使用单独的语句规则6一个while语句应该具有如下格式while condition{statements;说明一个空的while语句应该具有如下格式while condition;规则7•个do-while语句应该具有如下格式do{statements;}while condition;规则8一个switch语句应该具有如下格式switch condition{case ABC:statements;r fallsthrough*/case DEF:statements;break;case XYZ:statements;break;default:statements;break;规则9一个try-catch语句应该具有如下格式try{statements;}catch ExceptionClasse{statements;说明一个try-catch语句后面也可能跟着一个finally语句,不论try代码块是否顺利执行完,它都会被执行try{statements;}catch ExceptionClasse{statements;}finally{statements;
7.3空白规则i下列情况应该总是使用两个空行一个源文件的两个片段section之间;类声明和接口声明之间;规则2下列情况应该总是使用一个空行两个方法之间;方法内的局部变量和方法的第一条语句之间;块注释或单行注释之前;一个方法内的两个逻辑段之间说明空行将逻辑相关的代码段分隔开,以提高可读性规则3下列情况应该使用空格一个紧跟着括号的关键字应该被空格分开示例while true{说明空格不应该置于方法名与其左括号之间,这将有助于区分关键字和方法的调用空白应该位于参数列表中逗号的后面;所有的二元运算符,除了〃.”,应该使用空格将之与操作数分开一元操作符和操作数之间不因该加空格,比如:负号〃/、自增C++”和自减〃一〃;示例a+=c+d;a=a+b/c*d;while d++=s++{n++;printSizefsize is+foo+\n;for语句中的表达式应该被空格分开;示例for expri;expr2;expr3强制转型后应该跟一个空格;示例myMethodbyte aNum,Object x;myMethodint cp+5,inti+3+1;规则4if、while、for、default、do、break,continue等语句自占一行规则5函数的开始、类的定义及循环、判断等语句中的代码都要采用缩进风格,case语句下的情况处理语句也要遵从缩进要求规则6不同类型的操作符混合使用时,即使实现优先级与实际需要相符,也必须使用括号隔离之,以便代码更加清晰示例如本来是正确的代码if year%4==0||year%100!=0||year%400==0如果加上括号,则更清晰If year%4==0||year%100=0||year%400==0建议在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或前后要加空格;进行非对等操作时,如果是关系密切的操作符如-后不应加空格说明采用这种松散方式编写代码的目的是使代码更加清晰由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如括号内侧即左括号后面和右括号前面不要加空格,多重括号间不必加空格在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格给操作符留空格时不要连续留两个以上空格
8.异常日志
8.1异常处理规则
1.【强制】Java类库中定义的一类RuntimeException可以通过预先检查进行规避,而不应该通过catch来处理,比如IndexOutOfBoundsException,NullPointerException等等说明无法通过预检查的异常除外,如在解析一个外部传来的字符串形式数字时,通过catch NumberFormatException来实现正例if obj!=null{...}反例try{obj.method}catch NullPointerException e{...}规则
2.【强制】异常不要用来做流程控制,条件控制,因为异常的处理效率比条件分支低规则
3.【强制】对大段代码进行try-catch,这是不负责任的表现catch时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码对于非稳定代码的catch尽可能进行区分异常类型,再做对应的异常处理规则
4.【强制】捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容规则
5.【强制】有try块放到了事务代码中,catch异常后,如果需要回滚事务,一定要注意手动回滚事务规则
6.【强制】finally块必须对资源对象、流对象进行关闭,有异常也要做try-catch说明如果JDK7及以上,可以使用try-with-resources方式规则
7.【强制】不能在finally块中使用return,finally块中的return返回后方法结束执行,不会再执行try块中的return语句
197.
8.【强制】捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类说明如果预期对方抛的是绣球,实际接到的是铅球,就会产生意外情况规则
9.【推荐】方法的返回值可以为null,不强制返回空集合,或者空对象等,必须添加注释充分说明什么情况下会返回null值调用方需要进行null判断防止NPE问题说明本手册明确防止NPE是调用者的责任即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败、序列化失败、运行时异常等场景返回null的情况规则
10.【推荐】防止NPE,是程序员的基本修养,注意NPE产生的场景1返回类型为基本数据类型,return包装数据类型的对象时,自动拆箱有可能产生NPE反例public intf{return Integer对象},如果为null,自动解箱抛NPE2数据库的查询结果可能为null o3集合里的元素即使isNotEmpty,取出的数据元素也可能为null o4远程调用返回对象时,,一律要求进行空指针判断,防止NPE5对于Session中获取的数据,建议NPE检查,避免空指针6级联调用obj.getA.getB.getC;一连串调用,易产生NPE正例使用JDK8的Optional类来防止NPE问题规则
11.【推荐】定义时区分unchecked/checked异常,避免直接抛出new RuntimeException,更不允许抛出Exception或者Throwable,应使用有业务含义的自定义异常推荐业界已定义过的自定义异常,如DAOException/ServiceException等规则
12.【参考】在代码中使用“抛异常”还是“返回错误码”,对于公司外的http/api开放接口必须使用“错误码”;而应用内部推荐异常抛出;跨应用间RPC调用优先考虑使用Result方式,封装isSuccess方法、“错误码”、“错误简短信息”说明关于RPC方法返回方式使用Result方式的理由1使用抛异常返回方式,调用方如果没有捕获到就会产生运行时错误2如果不加栈信息,只是new自定义异常,加入自己的理解的error message,对于调用端解决问题的帮助不会太多如果加了核信息,在频繁调用出错的情况下,数据序列化和传输的性能损耗也是问题规则
13.【参考】避免出现重复的代码Don,t RepeatYourself,即DRY原则说明随意复制和粘贴代码,必然会导致代码的重复,在以后需要修改时,需要修改所有的副本,容易遗漏必要时抽取共性方法,或者抽象公共类,甚至是组件化正例一个类中有多个public方法,都需要进行数行相同的参数校验操作,这个时候请抽取:private booleancheckParamDTO dto{...}
8.2日志规约规则
1.【强制】应用中不可直接使用口志系统Log4j、Logback中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一import org.slf4j.Logger;import org.slf4j.LoggerFactory;private static final Loggerlogger=LoggerFactory.getLoggerAbc.class;规则
2.【强制】日志文件推荐至少保存15天,因为有些异常具备以“周”为频次发生的特占O规则
3.【强制】应用中的扩展日志如打点、临时监控、访问日志等命名方式appName_logType_logName.loglogType:口志类型,推荐分类有stats/desc/monitor/visit等;logName旧忐描述这种命名的好处通过文件名就可知道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找正例mppserver应用中单独监控时区转换异常,如mppserver_monitor_timeZoneConvert.log说明推荐为Fl志进行分类,如将错误日志和业务日志分开存放,便于开发人员查看,也便于通过口志对系统进行及时监控规则
4.【强制】对trace/debug/inf级别的日志输Hl,必须使用条件输出形式或者使用占位符的方式说明logger.debug Processingtrade with id:+id+and symbol:+symbol;如果日志级别是warn,上述日志不会打印,但是会执行字符串拼接操作,如果symbol是对象,会执行toString方法,浪费了系统资源,执行了上述操作,最终日志却没有打印正例条件if logger.isDebugEnabled{logger.debugProcessing tradewith id:+id+and symbol:+symbol;正例占位符logger.debugProcessing tradewithid:{}and symbol:{},id,symbol;规则
5.【强制】避免重复打印日志,浪费磁盘空间,务必在log4j.xml中设置additivity=false正例logger name=Mcom.taobao.dubbo.config,additivity=false规则
6.【强制】异常信息应该包括两类信息案发现场信息和异常堆栈信息如果不处理,那么通过关键字throws往上抛出正例logger.error各类参数或者对象toString++e.getMessage,e;规则
7.【推荐】谨慎地记录日志生产环境禁止输出debug日志;有选择地输出info日志如果使用warn来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘撑爆,并记得及时删除这些观察日志说明大量地输出无效日志,不利于系统性能提升,也不利于快速定位错误点记录日志时请思考这些口志真的有人看吗?看到这条日志你能做什么?能不能给问题排查带来好处?规则
8.【参考】可以使用warn日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适从注意日志输出的级别,error级别只记录系统逻辑出错、异常等重要的错误信息如非必要,请不要在此场景打出error级别
251.目的•避免常见错误,提高代码质量•提高代码的可维护性•提高代码的可读性
2.说明本规范作为一个标准的JAVA编码规范,其中对于规则是必须遵守的,建议是提醒您需要注意的地方,或者是在该情况下一个较好的选择
3.命名规范
3.1总的原则•使用完整的英文描述符•采用适用于该领域的术语;•采用大小写混合使名字可读;•尽量少用缩写,但也要避免使用长的名字最好小于15个字母;•避免使用类似的名字,或者仅仅是大小写不同的名字;•避免使用下划线
3.2文件File规则1对于文件扩展名,JAVA源文件命名为.java,对应的字节码文件为.class规则2对于文件名,类的文件命名为<类名>.二示例如通用树形显示控件类DisTree,其源文件为DisTree.java,对应的字节码文件为DisTree.clasSo
3.3包Package规则1一个唯一包名的前缀总是全部小写的ASCII字母并且是一个顶级域名,通常是com,edu,gov,mil,net,org,或1981年ISO3166标准所指定的标识国家的英文双字符代码包名的后续部分根据不同机构各自内部的命名规范而不尽相同这类命名规范可能以特定目录名的组成来区分部门department,项目project,机器machine,或注册名login nameso示例import javax.naming.InitialContext;edu.cmu.cs.bovik.cheese;
3.4类Class规则1类名是一个名词,采用大小写混合的方式,每个单词的首字母大写尽量使类名简洁而富F描述使用完整单词,避免缩写词除非该缩写词被更广泛使用,像URL,HTML示例class SavingsAccountclass ImageSprite
3.5接口Interface规则1命名规则与类相似,采用大小写混合的方式,每个单词的首字母大写示例interface Contactableinterface RasterDelegate建议名字后面加上后缀able,ible或者cr
3.6组件/部件Component规则1使用完整的英文描述来说明组件的用途,末端接上组件类型示例okButton,customerList,fileMenu
3.7异常Exception规则1通常采用字母e表示异常示例Exceptione
3.8变量Varables规则1除了变量名外,所有实例,包括类,类常量,均采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写说明变量名应简短且富于描述变量名的选用应该易于记忆,即,能够指出其用途示例firstName,lostFocusColor规则2除非是一次性的临时变显,变戢命名,禁止取单个字符如i,j,k,临时变最通常被取名为i,j,k,m和n,它们一般用于整型;c,d,e,它们一般用于字符型说明变量,尤其是局部变量,如果用单个字符表示,很容易犒错如i写成j,而编译时又检杳不出来,有可能为了这个小小的错误而花费大量的杳错时间;规则3避免使用数字来定义变量,尽管在语法上是允许的示例A8规则4命名中若使用特殊约定或缩写,则要有注释说明说明应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明规则4全局变量要有较详细的注释,包括对其功能、取值范围、哪些过程或函数存取它以及存取时注意事项等的说明说明在每次增加函数的时候,如需存取全局变量需在相应的全局变量处加上注释
3.9方法Methods规则1方法名是一个动词,采用大小写混合的方式,第•个单词尽可能采用•个生动的动词,第一个字母小写,其后单词的首字母大写示例:openFile,addAccountf规则2对于获取成员函数,被访问字段名的前面加上前缀get示例getFirstName,getLastNamef规则3对于布尔型的获取成员函数,所有的布尔型获取函数必须用单词is做前缀示例:isPersistentf,isStringf规则4对于设置成员函数被访问字段名的前面加上前缀seto示例setFirstName,setLastName,setWarpSpeed规则5对于构造函数,使用类名由于Java没有析构函数,但一个对象在垃圾收集时,调用成员函数finalizeo示例SavingsAccount finalize
3.10静态常量字段staticfinal规则i全部采用大写字母,单词之间用下划线分隔示例MIN_BALANCE,DEFAULT_DATE建议1尽量避免AMSI常量,容易引起错误
3.11并发处理规则
1.【强制】获取单例对象需要保证线程安全,其中的方法也要保证线程安全说明资源驱动类、工具类、单例工厂类都需要注意规则
2.【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯正例public classTimerTaskThread extendsThread{public TimerTaskThread{super.setNamefTimerTaskThread;规则
3.【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程说明使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决源不足的问题如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题规则
4.【强制】线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险说明Executors返1口1的线程池对象的弊端如下1FixedThreadPool和SingleThreadPool:允许的请求队列长度为lnteger.MAX_VALUE,可能会堆积大量的请求,从而导致00M2CachedThreadPool和ScheduledThreadPool:允许的创建线程数量为lnteger.MAX_VALUE,可能会创建大量的线程,从而导致00M规则
5.【强制】SimpleDateFormat是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用Datelltils工具类正例注意线程安全,使用DateUtils亦推荐如下处理private staticfinal ThreadLocalDateFormatdf=new ThreadLocalDateFormat{@Override protectedDateFormat initialValuef{return newSimpleDateFormatyyyy-MM-dd;};说明如果是JDK8的应用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat,官方给出的解释simple beautifulstrongimmutable thread-safe规则
6.【强制】高并发时,同步调用应该去考量锁的性能损耗能用无锁数据结构,就不要。