华为java 编码风格
1.排版
1-1程序块要采用缩进风格编写,缩进的空格数为4个。
1-2分界符(如大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类和接口的定义、以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。
1-3较长的语句、表达式或参数(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
1-4不允许把多个短语句写在一行中,即一行只写一条语句
1-5if, for, do, while, case, switch,default 等语句自占一行,且if,for, do, while等语句的执行语句无论多少都要加括号{}。
1-6相对独立的程序块之间、变量说明之后必须加空行。
1-7对齐只使用空格键,不使用TAB键。
1-8在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如.),后不应加空格。
2.注释规范
2-1.一般情况下,源程序有效注释量必须在30%以上。
2-2.包的注释:包的注释写入一个名为 package.html 的HTML格式的说明文件放入当前路径。
2-3.包的注释内容:简述本包的作用、详细描述本包的内容、产品模块名称和版本、公司版权。
2-4.文件注释:文件注释写入文件头部,包名之前的位置。
2-5.文件注释内容:版权说明、描述信息、生成日期、修改历史。
2-6.类和接口的注释:该注释放在 package 关键字之后,class 或者 interface 关键字之前。
2-7.类和接口的注释内容:类的注释主要是一句话功能简述、功能详细描述,
2-8.类属性、公有和保护方法注释:写在类属性、公有和保护方法上面。
2-9. 成员变量注释内容:成员变量的意义、目的、功能,可能被用到的地方。
2-10.公有和保护方法注释内容:列出方法的一句话功能简述、功能
2-11.对于方法内部用throw语句抛出的异常,必须在方法的注释中标明,对于所调用的其他方法所抛出的异常,选择主要的在注释中说明。 对于非RuntimeException,即throws子句声明会抛出的异常,必须在方法的注释中标明。
2-12.注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
2-13.注释与所描述内容进行同样的缩排。
2-14.将注释与其上面的代码用空行隔开。
2-15.对变量的定义和分支语句(条件分支、循环语句等)必须编写注释。
2-16.对于switch语句下的case语句,如果因为特殊情况需要处理完一个case后进入下一个case处理,必须在该case语句处理完、下一个case语句前加上明确的注释。
2-17.边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
2-18.注释的内容要清楚、明了,含义准确,防止注释二义性。
2-19.避免在注释中使用缩写,特别是不常用缩写。详细描述、输入参数、输出参数、返回值、违例等。
3.命名规范
3-1.包名采用域后缀倒置的加上自定义的包名,采用小写字母。在部门内部应该规划好包名的范围,防止产生冲突。部门内部产品使用部门的名称加上模块名称。产品线的产品使用产品的名称加上模块的名称。
3-2.类名和接口使用类意义完整的英文描述,每个英文单词的首字母使用大写、其余字母使用小写的大小写混合法。
3-3.方法名使用类意义完整的英文描述:第一个单词的字母使用小写、剩余单词首字母大写其余字母小写的大小写混合法。
3-4.方法中,存取属性的方法采用setter 和 getter方法,动作方法采用动词和动宾结构。
3-5.属性名使用意义完整的英文描述:第一个单词的字母使用小写、剩余单词首字母大写其余字母小写的大小写混合法。属性名不能与方法名相同。
3-6.常量名使用全大写的英文描述,英文单词之间用下划线分隔开,并且使用 final static 修饰。
3-7.属性名可以和公有方法参数相同,不能和局部变量相同,引用非静态成员变量时使用 this 引用,引用静态成员变量时使用类名引用。
4.编码规范
4-1.明确方法功能,精确(而不是近似)地实现方法设计。一个函数仅完成一件功能,即使简单功能也应该编写方法实现。
4-2.应明确规定对接口方法参数的合法性检查应由方法的调用者负责还是由接口方法本身负责,缺省是由方法调用者负责。
4-3.明确类的功能,精确(而不是近似)地实现类的设计。一个类仅实现一组相近的功能。
4-4.所有的数据类必须重载toString() 方法,返回该类有意义的内容。
4-5.数据库操作、IO操作等需要使用结束close()的对象必须在try -catch-finally 的finally中close()。
4-6.异常捕获后,如果不对该异常进行处理,则应该纪录日志或者ex.printStackTrace() 。
4-7.自己抛出的异常必须要填写详细的描述信息。
4-8.运行期异常使用RuntimeException的子类来表示,不用在可能抛出异常的方法声明上加throws子句。非运行期异常是从Exception继承而来的,必须在方法声明上加throws子句。
4-9.在程序中使用异常处理还是使用错误返回码处理,根据是否有利于程序结构来确定,并且异常和错误码不应该混合使用,推荐使用异常。
4-10.注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。
4-11.避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的静态变量来代替。
4-12.数组声明的时候使用 int[] index ,而不要使用 int index[] 。
4-13.调试代码的时候,不要使用 System.out 和 System.err 进行打印,应该使用一个包含统一开关的测试类进行统一打印。
4-14.用调测开关来切换软件的DEBUG版和正式版,而不要同时存在正式版本和DEBUG版本的不同源文件,以减少维护的难度。
5.JTEST规范
5-1.在switch 中每个 case 语句都应该包含 break 或者 return 。
5-2.不要使用空的for 、if 、while 语句。
5-3.在运算中不要减小数据的精度。
5-4.switch 语句中的 case 关键字要和后面的常量保持一个空格,switch 语句中不要定义case 之外的无用标签。
5-5.不要在if 语句中使用等号= 进行赋值操作。
5-6.静态成员或者方法使用类名访问,不使用句柄访问。
5-7.方法重载的时候,一定要注意方法名相同,避免类中使用两个非常相似的方法名。
5-8.不要在ComponentListener.componentResized() 方法中调用 serResize() 方法。 32
5-9.不要覆盖父类的静态方法和私有方法。
5-10.不要覆盖父类的属性。
5-11.不要使用两级以上的内部类。
5-12.把内部类定义成私有类。
5-13.去掉接口中多余的定义(不使用 public, abstract, static, final 等,这是接口中默认的)。
5-14.不要定义不会被用到的局部变量、类私有属性、类私有方法和方法参数。
5-15.显式初始化所有的静态属性。
5-16.不要使用 System.getenv() 方法。
5-17.不要硬编码 ‘\n’和‘\r’作为换行符号。
5-18.不要直接使用 java.awt.peer.* 里面的接口。
5-19.使用 System.arraycopy() ,不使用循环来复制数组。
5-20.避免不必要的 instanceof 比较运算和类造型运算。
5-21.不要在 finalize() 方法中删除监听器(Listeners)。
5-22.在 finalize() 方法中一定要调用 super.finalize() 方法。
5-23.在 finalize() 方法中的 finally 中调用 super.finalize() 方法。
5-24.进行字符转换的时候应该尽可能的较少临时变量。
5-25.使用ObjectStream 的方法后,调用reset() ,释放对象。
5-26.线程同步中,在循环里面使用条件测试(使用 while(isWait) wait() 代替 if(isWait) wait())。
5-27.不掉用 Thread 类的 resume(), suspend(), stop() 方法。
5-28.减小单个方法的复杂度,使用的 if, while, for, switch 语句要在10个以内。
5-29.在Servlets中,重用JDBC连接的数据源。
5-30.减少在Sevlets中使用的同步方法。
5-31.不定义在包中没有被用到的友好属性、方法和类。
5-32.没有子类的友好类应该定义成 final 。
5-33.没有被覆盖的友好方法应该定义成 final
腾讯编码风格:
java
1 .缩进
1-1程序块要采用缩进风格编写,缩进只使用TAB键,不能使用空格键(编辑器中请将,TAB设置为4格);
1-2方法体的开始、类的定义、以及if、for、do、while、switch、case语句中的代码都
要采用缩进方式;
2.对齐
2-1程序块的分界符左大括号”{” 和右大括号”}”都另起一行,应各独占一行并且位于同
一列,同时与引用它们的语句左对齐;
2-2对齐只使用TAB键,不使用空格键;
2-3不允许把多个短语句写在一行中,即一行只写一条语句;
2-4 if、for、do、while、case、switch、default等语句自占一行。
3.换行
一行的长度超过80个字符需要换行,换行规则如下:
3-1在一个逗号后面断开;
3-2在一个操作符前面断开;
3-3长表达式要在低优先级操作符处划分新行;
3-4新行缩进2个TAB。
4.间隔
4-1类、方法及相对独立的程序块之间、变量说明之后必须加空行;
4-2关键字之后要留空格, 象if、for、while 等关键字之后应留一个空格再跟左括号”(”, 以突出关键字;
4-3方法名与其左括号”(”之间不要留空格, 以与关键字区别;
4-4二元操作符如 ” =”、” +=” ” >=”、” <=”、” +”、*”、” %”、”&&”、” ||”、” << ,” ^” 等的前后应当加空格;
4-5一元操作符如” !”” ~”、”++”、” –”等前后不加空格;
4-6象”[ ]”、” .” 这类操作符前后不加空格;
4-7 for语句中的表达式应该被空格分开,如:
4-8强制转型后应该跟一个空格,如:
5.注释
5-1 文件注释:所有的源文件都应该在开头有一个注释,其中列出文件的版权声明、文件名、功能描述以及创建、修改记录:
5.2 类或接口注释
采用JavaDoc文档注释,在类、接口定义之前应当对其进行注释,包括类、接口的描述、最新修改者、版本号、参考链接等:注:JavaDoc文档注释:描述Java的类、接口、构造方法、方法、以及字段。每个文档注释都被置于注释定界符/…*/之中,一个注释对应一个类、接口或成员。该注释应位于声明之前。文档注释的第一行(/)不需缩进,随后的文档注释每行都缩进1格(使星号纵向对齐)。
5-3 字段注释:采用JavaDoc文档注释,定义为public的字段必需给出注释,在类的(静态)
变量、实例变量定义之前当对其进行注释,给出该字段的描述等.
5-4方法注释 采用JavaDoc文档注释,在方法定义之前当对其进行注释,包括方法的描述、输入、输出及返回值说明、抛出异常说明、参考链接等:
5-5 其它注释(非文档注释):单行代码注释一律使用注释界定符
6.命名
6-1 基本规则:使用可以准确说明变量、字段、类、接口、包等完整的英文描述符;采用大小写混合,提高名字的可读性;采用该领域的术语;尽量少用缩写,但如果一定要使用,当使用公共缩写和习惯缩写等;避免使用相似或者仅在大小写上有区别的名字。
6-2 包命名:包名一律小写, 少用缩写和长名;采用以下规则:[基本包].[项目名].[模块名子模块名]..基本包:com.tencent或 com.qq;不得将类直接定义在基本包下,所有项目中的类、接口等都应当定义在各自的项目 和模块包中;
6-3 类或接口命名:类或接口名是个一名词,采用大小写混合的方式,每个单词的首字母大写。尽量使你的类名简洁而富于描述。使用完整单词,避免用缩写词(除非该缩写词被更广泛使用.
6-4变量命名:采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写;变量名不应以下划线或美元符号开头;尽量避免单个字符的变量名,除非是一次性的临时变量。临时变量通常被取名为i,j,对不易清楚识别出该变量类型的变量应使用类型名或类型
名缩写作其后缀;组件或部件变量使用其类型名或类型名缩写作其后缀;集合类型变量,例如数组和矢量,应采用复数命名或使用表示该集合的名词做后缀:
6-5 常量命名:全部采用大写,单词间用下划线隔开.
6-6 方法命名 方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写;取值类可使用get前缀,设值类可使用set前缀,判断类可使用is(has)前缀。
7.声明
7-1类或接口声明 类、接口定义语法规范:
7-2方法声明:良好的程序设计应该尽可能减小类与类之间耦合,所遵循的经验法则是:尽量限制成员函数的可见性。如果成员函数没必要公有 (public),就定义为保护 (protected);没必要保护 (protected),就定义为私有 (private);方法定义语法规范:[可见性][‘abstract’] [‘static’] [‘final’][‘synchronized’][返回值类型]method_name(参数列表)[(‘throws’)][异常列表];声明顺序:构造方法静态公共方法静态私有方法 公共方法 友元方法 受保护方法 私有方法main方法;方法参数建议顺序:(被操作者,操作内容,操作标志,其他)
7-3变量声明:一行一个声明;声明局部变量的同时初始化(在变量的初始值依赖于某些先前发生的计算的特殊情况下可以不用同时初始化);只在代码块的开始处声明变量,(一个块是指任何被包含在大括号”{“和”}”中间的代码)不要在首次用到该变量时才声明;避免声明的局部变量覆盖上一级声明的变量,即不要在内部代码块中声明相同的变量名;公共和保护的可见性应当尽量避免,所有的字段都建议置为私有,由获取和设置成员函数(Getter、Setter)访问定义一个变量或者常量的时候,不要包含包名(类似java.security.MessageDigestdigest =null),而要定义成下面的格式,除非是两个包有相同的类名字段定义语法规范: 数组声明时应当将”[]”跟在类型后,而不是字段名后:声明顺序:常量 类变量 实例变量: 公有字段 受保护字段 友元字段 私有字段
8.异常
8-1捕捉异常的目的是为了处理它。
8-2多个异常应分别捕捉并处理,避免使用一个单一的catch来处理。
9.习惯
9-1 if、for、do、while等语句的执行语句部分无论多少都要加括号”{}”;
9-2每当一个case顺着往下执行时(因为没有break语句),通常应在break
语句的位置添加注释;
9-3尽量避免在循环中构造和释放对象;
9-4在使用局部变量的过程,按就近原则处理。不允许定义一个局部变量,然后在很远的地方才使用;
9-5相同的功能不允许复制成N份代码;
9-6在处理 String 的时候要尽量使用 StringBuffer 类。
百度编码风格:
Java
1.代码书写
1-1程序块要采用K&R代码风格编写,缩进的空格数为4个, 不能使用Tab说明:不同的缩进风格对代码的可读性影响很大,以tab为缩进单位在不同的tab step下可读性也相差很多,所以将缩进定为一个soft tab即4个空格,这样在所有环境下缩进都会保持一致。
1-2if、while、for、do语句的执行体总是用”{“和”}”括起来,即使单条语句也是并且在较长(超过一屏)的判断或者循环语句的结尾应该有注释语句做出标识。
1-3每行仅包含一条语句.说明: 这样做可读性更好。
2.命名要求
2-1Package 的名字应该都是由一个小写单词组成
2-2类(class)命名规则:类名是个一名词,大写开始,采用骆峰命名规则。使用完整单词,避免缩写词
2-3参数和变量的名字必须用一个小写字母开头,后面的单词用大写字母开头, 只允许使用字母和数字, 使用骆峰命名方式常量和枚举的属性必须全部使用大写,并且使用完整含义的单词,每个单词之间使用“_”分割
3.注释
3-1要求类、接口、公有方法都必须添加注释类、接口的注释, 说明该类或者接口的主要作用。
3-2方法注释采用标准的javadoc注释规范,注释中必须提供方法说明,参数说明和返回值和异常说明
4.常量与变量
4-1具有全局性逻辑功能的常量值需要定义为常量类型且相同含义的常量只能定义在一处。一行一个声明,避免在一个语句中给多个变量赋值。只在代码块的开始处声明变量,内外层的代码声明不要重名。
4-2对于固定且编译时可列的对象,如Status,Type等,应采用enum而非自定义常量实现。enum的好处是类型更清楚,不会在编译时混淆
5.空格
5-1一个紧跟着括号的关键字应该用空格分开
5-2空格应该位于参数列表中逗号的后面
5-3所有的二元运算符,除了”.”,都必须用空格与操作数分开
5-4for语句中的表达式应该被空格分开强制转型后应该跟一个空格
6.方法
6-1方法行数不能超过500行, 类的行数不能超过3000
6-2方法的参数个数不能超过7个参数过多但导致方法的使用和理解上增加难度,也会导致使用量容易弄混顺序。针对需要使用到过多参数时,可以抽取对象方式进行传递。
6-3方法内调用的嵌套不能超过5层过多的嵌套会加大代码阅读的难度,
6-4判断方法入口参数的合法性,特别是public,一定要检查入口参数是否合法。不要在方法中对方法的参数进行赋值。
6-5方法返回值,不能返回null;除非需要通过null表达特殊含义,同时必须在方法注释中加说明。返回布尔值的方法,需要以is打头。
6-6不用的方法直接删除,不建议使用的方法加Deprecated进行保留。
7.编码规则
7-1尽量使用接口而不是一个具体的类。
7-2异常捕获后必须处理,不能吃掉异常同一个异常,只在一处打印,log时需要打印异常的stack trace
7-3为了避免重复打印相同的异常日志,同一个异常,只在一处打印
7-4未使用的import和变量必须删除
7-5使用一个由其他方法返回的对象之前,先判断是否为null,以免产生NullPointerException 异常
7-6字符串比较时,将常量置于equals之前,避免null异常。
7-7如果涉及10个以上字符串的拼接,应该使用StringBuffer 或 StringBuilder,避免使用“+”号拼接产生大量中间对象线程上下文ThreadLocal变量的使用必须配必须手动清除,否则可能导致脏数据、内存溢出等问题。
7-8防止下标越界,在使用数组下标之前先判断下标的合法性,比如数组类型,集合类型。8.多线程并发
8-1对重要业务对象,需要防止对过时数据的修改
8-2对资源加锁时必须保证一致的加锁顺序,否则可能导致死锁。
8-3如果使用了静态工具类或单例,必须确保是线程安全的。Jdk自带的一些工具类也未必线程安全,比如DateFormat,每次请求使用时必须重新构造
8-4避免直接使用Thread,建议使用Concurrent包。
以上转载文章《华为,腾讯,百度编码风格和个人编码风格》部分内容。